【问题标题】:Regex in python not matching what grep doespython中的正则表达式与grep不匹配
【发布时间】:2015-07-02 11:18:02
【问题描述】:

我有以下字符串:

string1; 1.8w/v PEG_8000; string2; ;;

我想获得; 1.8w/v PEG_8000; 部分。我尝试了以下方法:

a =re.search(';[^.;]+PEG[^.;]+;','string1; 1.8w/v PEG_8000; string2; ;;'

返回a = None

我错过了什么?

(OS X Yosemite,Python 2.7

编辑:我之前说过以下的话,我发现这不是真的。我忘记了我在尝试之前编辑了字符串。

有趣的是,如果我执行grep -E --color ';[^.;]+PEG[^.;]+;' file,其中file 包含字符串,它可以突出显示它。

编辑 2: 我有一个包含此类字符串的大文件,其中关键字 PEG 不一定出现在第二个字段中。这就是为什么我不使用split(';')

【问题讨论】:

    标签: python regex python-2.7 osx-yosemite


    【解决方案1】:

    否定字符类匹配所有除了那些指定的字符。因此,文字 . 在这里引起了问题。您可以按如下方式修改正则表达式:

    >>> import re
    >>> s = 'string1; 1.8w/v PEG_8000; string2; ;;'
    >>> re.search(';[^;]+PEG[^;]+;', s).group()
    '; 1.8w/v PEG_8000;'
    

    【讨论】:

      【解决方案2】:

      您需要从第一个字符类中删除点。因为分号和子字符串 PEG 之间存在一个点,这导致正则表达式失败。请注意,字符类中存在的点仅匹配文字点。

      >>> re.search(r';[^;]+PEG[^.;]+;','string1; 1.8w/v PEG_8000; string2; ;;').group()
      '; 1.8w/v PEG_8000;'
      

      【讨论】:

      • 这有什么变化?当您添加 r 时还会发生什么变化?
      • @sodiumnitrate 您需要从字符类中删除点,仅此而已。使用原始字符串表示法总是更好。
      • 谢谢。不过,我有点困惑。不是.表示任意字符,\.实际上表示点吗?
      • 字符类中的点与文字点匹配。
      【解决方案3】:

      没有re的方式:

      >>> s='string1; 1.8w/v PEG_8000; string2; ;;'
      >>> ';'+s.split(';')[1]+';'
      '; 1.8w/v PEG_8000;'
      

      【讨论】:

      • 感谢您的回答。我没有告诉你字符串是一个大文件的一部分,其中关键字PEG 的字段并不总是第二列。
      • @sodiumnitrate,您应该将该要求添加到问题中。
      猜你喜欢
      • 2017-02-09
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多