【问题标题】:negating with re.search (find strings that don't contain a specific character)用 re.search 取反(查找不包含特定字符的字符串)
【发布时间】:2014-06-14 20:40:52
【问题描述】:

我正在尝试让re.search 查找其中没有字母 p 的字符串。我的正则表达式代码返回列表中我不想要的所有内容。我写了一个替代解决方案,它给了我想要的确切结果,但我想看看这是否可以用re.search 解决,但我也会接受另一个正则表达式解决方案。我也试过re.findall,但没有用,re.match 也不起作用,因为它会在字符串的开头查找模式。

import re

someList = ['python', 'ppython', 'ython', 'cython', '.python', '.ythop', 'zython', 'cpython', 'www.python.org', 'xyzthon', 'perl', 'javap', 'c++']

# this returns everything from the source list which is what I DON'T want
pattern = re.compile('[^p]')
result = []

for word in someList:
    if pattern.search(word):
        result.append(word)
print '\n', result
''' ['python', 'ppython', 'ython', 'cython', '.python', '.ythop', 'zython', 'cpython', 'www.python.org', 'xyzthon', 'perl', 'javap', 'c++'] '''

# this non regex solution returns the results I want
cnt = 0; no_p = []

for word in someList:
    for letter in word:
        if letter == 'p':
            cnt += 1
            pass
    if cnt == 0:
        no_p.append(word)
    cnt = 0
print '\n', no_p
''' ['ython', 'cython', 'zython', 'xyzthon', 'c++'] '''

【问题讨论】:

    标签: regex python-2.7 regex-negation


    【解决方案1】:

    你快到了。您正在使用的模式正在寻找至少一个不是“p”的字母。你需要一个更严格的。试试:

    pattern = re.compile('^[^p]*$')
    

    【讨论】:

      【解决方案2】:

      您对字符集否定的理解是有缺陷的。正则表达式 [^p] 将匹配其中包含 p 以外的字符的任何字符串,这是您的所有字符串。要“否定”正则表达式,只需否定 if 语句中的条件。所以:

      import re
      
      someList = ['python', 'ppython', 'ython', 'cython', '.python', '.ythop', 'zython', 'cpython', 'www.python.org', 'xyzthon', 'perl', 'javap', 'c++']
      
      pattern = re.compile('p')
      result = []
      for word in someList:
          if not pattern.search(word):
              result.append(word)
      print result
      

      当然,使用正则表达式来查看字符串中是否有单个特定字符是毫无意义的。您的第二次尝试更适合于此,但可以更好地编码:

      result = []
      for word in someList:
          if 'p' not in word:
              result.append(word)
      print result
      

      【讨论】:

      • 用这个re.compile('^((?!p).)*$') 替换我的原始模式也可以。我在这个网站上找到了这个解决方案stackoverflow.com/questions/717644/…
      • @MichaelSwartz:这是一个更通用的解决方案,如果“禁止字符串”长于单个字符(甚至是整个正则表达式),则很有用。对于不包含 single 字符的字符串的简单要求,ooga 或 fmdra 的答案是最佳解决方案。 ooga 可能会更快 - 需要对其进行分析。
      • @ooga --- 是的,我明白你的意思。感谢您澄清这一点,现在我对字符集否定的理解不那么有缺陷了。
      猜你喜欢
      • 2012-10-19
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2015-01-31
      相关资源
      最近更新 更多