regex 如何在Python正则表达式中捕获由一致符号分隔的字母的单词?

raogr8fs  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(164)

我正在尝试编写一个Python正则表达式模式,它将允许我捕获给定文本中的单词,这些单词的字母由相同的符号或空格分隔。
例如,在文本“This is s u p e r and s.u.p.e.r and s👌u👌p👌e👌r and s!u.p!e.r”中,我的目标是提取单词“s u p e r”,“s.u.p.e.r”和s👌u👌p👌e👌r。但是,我想排除“s!u.p!e.r”,因为它在单词中没有相同的一致分隔符号。
我目前正在使用以下内容:

x="This is s u p e r and s.u.p.e.r and s👌u👌p👌e👌r and s!u.p!e.r"

pattern = r"(?:\b\w[^\w\d]){2,}"

re.findall(pattern, x)

['s u p e r ', 's.u.p.e.r ', 's👌u👌p👌e👌r ', 's!u.p!e.']

我只是好奇是否有可能排除那些没有相同符号的案例。

e1xvtsh3

e1xvtsh31#

您可以考虑使用

pattern = r"(?<!\S)\w(?=(\W))(?:\1\w)+(?!\S)"
results = [m.group() for m in re.finditer(pattern, x)]

参见Python demoregex demo

import re
x="This is s u p e r and s.u.p.e.r and s👌u👌p👌e👌r and s!u.p!e.r"
pattern = r"(?<!\S)\w(?=(\W))(?:\1\w)+(?!\S)"
print([m.group() for m in re.finditer(pattern, x)])
# => ['s u p e r', 's.u.p.e.r', 's👌u👌p👌e👌r']
  • 图案详情 *
  • (?<!\S)-左侧空白边界
  • \w-一个字字符
  • (?=(\W))-一个积极的前瞻,要求下一个字符e一个非字字符将其捕获到第1组(\1
  • (?:\1\w)+-与第1组中捕获的相同字符的一个或多个重复,然后是单个单词字符
  • (?!\S)-右侧空白边界
smdncfj3

smdncfj32#

如果您希望匹配至少2个单词字符,则可以捕获第一个和最后一个字符,中间有一个捕获组(\W)
然后可选地重复匹配一个单词char,后跟一个反向引用\1到同一个捕获的char:

(?<!\S)\w(\W)(?:\w\1)*\w(?!\S)

图案吻合

  • (?<!\S)在左边声明一个空白边界(因为使用\b会给予部分单词匹配)
  • \w(\W)匹配一个单字char,捕获一个单字char,group 1中的数字除外
  • (?:\w\1)*可选地重复匹配单个单词char和组1的反向引用
  • \w(?!\S)匹配一个单词char,后跟右边的空白边界

参见regex demoPython demo
由于(\W)这一部分是在group 1中捕获的,因此您必须使用 re.finditer 来获得完整的匹配,因为使用 re.findall 将仅返回group 1的值。

相关问题