python regex:匹配最后一个字符实例,后跟某个模式

时间:2014-12-29 12:11:33

标签: python regex match

我想编辑下面的代码以捕获所有带有“_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'结束,我如何编辑我的代码来处理这个错误?

由于

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

<强>代码

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

答案 2 :(得分:0)

您发现_的最后一次出现后跟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](数字或字母)后跟$(行尾)。

答案 3 :(得分:0)

使用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

答案 4 :(得分:0)

 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