【问题标题】:Python Regex Picking "not include" wordPython正则表达式选择“不包括”字
【发布时间】:2024-01-15 01:58:01
【问题描述】:

我试图在字符串中查找不包含任何“a”字符的单词。我写了下面的代码,但它不起作用。我怎么能对正则表达式说“不包括”?我不能用“^”符号作为“不是”吗?

import re
string2 = "asfdba12312sssdr1 12şljş1 kf"
t = re.findall(r'([^a]\w*) | \w*[^a] ', string2 )
print(t)

该代码的结果是"['sfdba12312sssdr1', '12şljş1']"

【问题讨论】:

    标签: python regex search find match


    【解决方案1】:

    您需要使用带有re.UNICODE 标志的单词边界的正则表达式:

    r = re.compile(ur'\b[^\Wa]+\b', re.UNICODE)
    

    \W\b 届时将支持 Unicode。

    regex demo

    [^\Wa] 匹配任何 Unicode 字母、数字或内标,但不匹配 a。添加 re.I 标志以使其不区分大小写。

    如果您不想用数字匹配单词,请将\d 添加到 char 类中:[^\W\da]

    Python demo:

    # -*- coding: utf-8 -*-
    import re
    p = re.compile(ur'\b[^\Wa]+\b', re.UNICODE)
    s = u"asfdba12312sssdr1 12şljş1 kf"
    res = [x.encode('utf8') for x in p.findall(s)]
    print(res)
    

    【讨论】:

    • 结果是"re.compile('\\b[^\\Wa]+\\b')"
    【解决方案2】:

    [^a] 是单个非a 字符。 [^a]\w* 是单个非a 字符,后跟任意数量的单词字符。注意空格是非a字符,word-characters也可以包括a...

    在 Python 中执行此操作的最简单、最直观的方法是根本不使用 re.findall

    [word for word in string2.split() if not 'a' in word]
    

    【讨论】:

    • 此代码会将word1,word2?! 视为单词(即包含标点和符号)。
    • @WiktorStribiżew:好点。我想,向 OP 展示不使用废话作为示例的好处。
    • 使用rx = re.compile(r'\b\w+\b', re.UNICODE),您可以选择words = [word for word in rx.findall(string2) if not 'a' in word]