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

Gra*_*ell 4 python regex

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

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

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

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

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

jda*_*daz 6

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

a = "should print n?t thìs"
re.findall(r"(\b[A-Za-z]+\b)", a)
# ['should', 'print']
Run Code Online (Sandbox Code Playgroud)

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

至于负前瞻,它们使用语法(?!...), with ?before !,并且它们必须在括号中。要在此处使用,您可以使用:

r"\b(?!\w*[À-?])\w*"
Run Code Online (Sandbox Code Playgroud)

这个:

  • 检查词边界\b,如空格或输入字符串的开头。
  • 如果找到任何以 0 个或多个单词字符开头的特殊字符,则执行否定前瞻并停止匹配。你必须包括\w*因为(?![À-?])只会检查特殊字符是单词中的第一个字母。
  • 最后,如果它通过前瞻,它匹配任何单词字符。

演示。请注意,在 regex101.com 中,您必须指定 Python 风格\b才能正确处理特殊字符。

还有第三种选择:

r"\b[^À-?\s]*\b"
Run Code Online (Sandbox Code Playgroud)

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