繁体   English   中英

Python中组的反向正则表达式匹配

[英]Inverse regex match on group in Python

我看到很多措辞相似的问题,但我在想出这个语法时遇到了惊人的困难。

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

我有一个正则表达式,它标识带有特殊字符\\w*[\À-\ǚ']\\w* 我已经看到很多答案都带有相当简单的场景,比如一个简单的 word 但是,我找不到任何否定组的东西 - 我已经看到了几组不同的语法来包含否定前瞻?! ,但我一直无法想出一种适用于它的语法。

在我的情况下,给出一个字符串,如:“应该打印 nŌt thìs”

应该打印shouldprint但不是其他两个词。 re.findall("(\\w*[\À-\ǚ']\\w*)", paragraph.text)为您提供特殊字符 - 我只是想反转它。

对于这种特殊情况,您只需在搜索中指定常规字母范围:

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 中,您必须为\\b指定 Python 风格才能正常处理特殊字符。

还有第三种选择:

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

中间部分[^À-ǚ\\s]*表示无限次匹配特殊字符或空格以外的任何字符。

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

>>> 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反转。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM