我正在尝试编写一个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.']
我只是好奇是否有可能排除那些没有相同符号的案例。
2条答案
按热度按时间e1xvtsh31#
您可以考虑使用
参见Python demo和regex demo。
(?<!\S)
-左侧空白边界\w
-一个字字符(?=(\W))
-一个积极的前瞻,要求下一个字符e一个非字字符将其捕获到第1组(\1
)(?:\1\w)+
-与第1组中捕获的相同字符的一个或多个重复,然后是单个单词字符(?!\S)
-右侧空白边界smdncfj32#
如果您希望匹配至少2个单词字符,则可以捕获第一个和最后一个字符,中间有一个捕获组
(\W)
。然后可选地重复匹配一个单词char,后跟一个反向引用
\1
到同一个捕获的char:图案吻合
(?<!\S)
在左边声明一个空白边界(因为使用\b
会给予部分单词匹配)\w(\W)
匹配一个单字char,捕获一个单字char,group 1中的数字除外(?:\w\1)*
可选地重复匹配单个单词char和组1的反向引用\w(?!\S)
匹配一个单词char,后跟右边的空白边界参见regex demo和Python demo。
由于
(\W)
这一部分是在group 1中捕获的,因此您必须使用 re.finditer 来获得完整的匹配,因为使用 re.findall 将仅返回group 1的值。