【问题标题】:python regex: match last instance of character followed by certain partternpython 正则表达式:匹配字符的最后一个实例,后跟特定模式
【发布时间】:2015-02-25 15:01:17
【问题描述】:

我想编辑下面的代码以捕获所有以“_C[任意字母/任意数字/或无]”结尾的字符串

这是我的清单

 name_list = ['chrome_PM',
             'chrome_P',
             'chromerocker_C',
             'chromebike_P1',
             'chromecar_CMale',
             'chromeone_C1254',
             'Lukate_Aids_Consumer_P']

for name in name_list:
    counts_tail = re.compile('_C[\da-zA-Z_]*$')
    if counts_tail.search(name):
        print name

输出:

chromerocker_C
chromecar_CMale
chromeone_C1254
Lukate_Aids_Consumer_P

预期输出:

chromerocker_C
chromecar_CMale
chromeone_C1254

不应包含“Lukate_Aids_Consumer_P”,因为它不以“_C”结尾,我该如何编辑我的代码来处理这个错误?

谢谢

【问题讨论】:

  • 一种pythonic方式:matching = [s for s in name_list if "_C" in s]
  • 你用的是什么python?我在 python 2.7.6 中运行了你的脚本,输出只有这两个:chromecar_CMalechromeone_C1254
  • 我无法重现您的代码。我只用你当前的代码得到chromecar_CMale and chromeone_C1254
  • 奇怪,我用的是python 2.7
  • 对不起,我使用的是旧的正则表达式,现在试试,它应该可以工作。

标签: python regex match


【解决方案1】:

代码

name_list = ['chrome_PM',
             'chrome_P',
             'chromerocker_C',
             'chromebike_P1',
             'chromecar_CMale',
             'chromeone_C1254',
             'Lukate_Aids_Consumer_P']

for name in name_list:
    counts_tail = re.compile('_C(\d|[a-zA-Z])*$') # Added * 
                                                  # Unnecessary use of + in both \d and [a-zA-Z] (thanks to @Ashwani Dausodia)
    if counts_tail.search(name):
        print name

输出

chromerocker_C
chromecar_CMale
chromeone_C1254

【讨论】:

  • @Wazzy,谢谢这个作品,但我编辑了我原来的正则表达式,我不小心发布了一个旧版本。能不能试试新版本。谢谢!
  • 为了所有神圣的爱,请不要写像(x+)*这样的正则表达式。
  • \d[a-zA-Z] 中不必要地使用+
【解决方案2】:

您只需从最后一个字符类中删除_

counts_tail = re.compile('_C[\da-zA-Z_]*$')
                                     ^
                                     |

所以正确的形式应该是,

 name_list = ['chrome_PM',
             'chrome_P',
             'chromerocker_C',
             'chromebike_P1',
             'chromecar_CMale',
             'chromeone_C1254',
             'Lukate_Aids_Consumer_P']

for name in name_list:
    counts_tail = re.compile('_C[\da-zA-Z]*$')
    if counts_tail.search(name):
        print name

由于字符类中存在_,它匹配Lukate_Aids_Consumer_P 中的_Consumer_P 子字符串。

【讨论】:

    【解决方案3】:
     name_list = ['chrome_PM',
             'chrome_P',
             'chromerocker_C',
             'chromebike_P1',
             'chromecar_CMale',
             'chromeone_C1254',
             'Lukate_Aids_Consumer_P']
    
    for name in name_list:
        counts_tail = re.compile('_C[\da-zA-Z]*$')
        if counts_tail.search(name):
            print name
    

    【讨论】:

      【解决方案4】:

      使用re.compile('_C[^\W_]*$')

      您可以简单地使用re.compile('_C\w*$'),但\w 也包括_,这不是必需的。所以最好的方法是使用re.compile('_C[^\W_]*$'),它排除除字母、数字和_以外的所有内容

      演示:

      >>> name_list = ['chrome_PM',
               'chrome_P',
               'chromerocker_C',
               'chromebike_P1',
               'chromecar_CMale',
               'chromeone_C1254',
               'Lukate_Aids_Consumer_P']
      
      >>> for name in name_list:
      ...     counts_tail = re.compile('_C[^\W_]*$')
      ...     if counts_tail.search(name):
      ...         print name
      ... 
      chromerocker_C
      chromecar_CMale
      chromeone_C1254
      

      【讨论】:

        【解决方案5】:

        您发现_ 的最后一次出现是否跟在C 后面:

        for name in name_list:
            index = name.rfind('_')
            if(name[index+1] == 'C'):
               print name
        

        记住只有当你的字符串不包含除数字、字母和_以外的字符时,你才能使用它。否则你可以使用这个正则表达式:

        '_C(\d|[a-zA-Z])*$'
        

        这意味着_C后跟零次或多次出现\d|[a-zA-Z](数字或字母)后跟$(行尾)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-18
          • 2022-12-03
          • 2015-06-18
          相关资源
          最近更新 更多