Python中对组进行反向正则表达式匹配

4

我看到了很多类似措辞的问题,但我很难想出这个语法。

给定一个单词列表,我想打印所有 没有 特殊字符的单词。

我有一个正则表达式可以识别 带有 特殊字符的单词 \w*[\u00C0-\u01DA']\w*。我见过很多答案,比如简单的单词的场景相对简单。然而,我还没有找到任何否定一个组的内容 - 我看到了几个不同的负向前瞻语法 ?!,但我还没有能够找到一个可以与之一起工作的语法。

在我的情况下,假设字符串为:"should print nŌt thìs"

应该打印 shouldprint,但不是其他两个单词。re.findall("(\w*[\u00C0-\u01DA']\w*)", paragraph.text) 给出了特殊字符 - 我只想反转它们。

2个回答

6
对于这种情况,您可以在搜索中指定正常的字母范围:
a = "should print nŌt thìs"
re.findall(r"(\b[A-Za-z]+\b)", a)
# ['should', 'print']

当然,您还可以添加数字或任何其他要匹配的内容。

至于负向先行断言,它们使用语法(?!...),在感叹号前加上?,并且必须用括号括起来。要在此处使用一个负向先行断言,可以使用以下代码:

r"\b(?!\w*[À-ǚ])\w*"

这个正则表达式的作用如下:

  • 检查单词边界,例如空格或者输入字符串的开始位置\b
  • 进行负向预查,在0个或更多个单词字符之前查找任何特殊字符并停止匹配。你必须包括\w*,因为(?![À-ǚ])只会检查特殊字符是否是单词中的第一个字母。
  • 最后,如果它通过了预查,就匹配任何单词字符。

演示。请注意,在regex101.com上,您必须指定Python风格才能正确使用带有特殊字符的\b

还有第三个选项:

r"\b[^À-ǚ\s]*\b"

中间部分[^À-ǚ\s]*表示匹配除了特殊字符和空白之外的任何字符,数量不限。


我认为第一个正则表达式不起作用,因为它匹配像 zhì 这样的内容 - 它只匹配了 zh。 - Grant Curell
另一个问题是,r"\b(?!\w*[À-ǚ])\w*" 只能在基于拉丁字符的特殊字符上工作吗? - Grant Curell
1
是的,第一个也应该被\b包围。已修复。是的,“特殊字符”指的就是您发布的范围,[\u00C0-\u01DA] - jdaz

0

我知道这不是正则表达式,而是一个完全不同的想法,除了使用正则表达式之外,您可能没有考虑过。我想它也会慢得多,但我认为它可以工作:

>>> import unicodedata as ud    
>>> [word for word in ['Cá', 'Lá', 'Aqui']\
    if any(['WITH' in ud.name(letter) for letter in word])]
['Cá', 'Lá']

或者使用... 'WITH' not in来进行反转。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接