python regex:表达式匹配数字和字母

时间:2014-11-07 10:07:45

标签: python regex string

目的是打印不以"_C[any number+letter]"结尾的所有内容。

def regexer():

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

for name in name_list:
    counts_tail = re.compile('_C\d*$')
    if not counts_tail.search(name):
        print name

输出:

chrome_PM
chrome_P
chromebike_P1
chromecar_CMale

如何编辑我的代码以避免打印" chromecar_CMale"?

4 个答案:

答案 0 :(得分:1)

_C[\da-zA-Z]*$

这应该这样做。

答案 1 :(得分:1)

如下所示更改正则表达式

>>> import re
>>> name_list = ['chrome_PM', 'chrome_P', 'chromerocker_C', 'chromebike_P1', 
                 'chromecar_CMale', 'chromeone_C1254']
>>> for name in name_list:
    if re.search(r'^(?!.*(?:_C\d+|_C)$)(?=.*_C)', name):
        print(name)


chromecar_CMale

<强>解释

  • ^断言我们刚开始。
  • (?!.*(?:_C\d+|_C)$)这种消极的前瞻声称,不会有_C一个或多个数字,或者_C后面跟着行锚的一端。
  • (?=.*_C)断言必须存在类似_C的子字符串。
  • 仅在满足上述条件时才匹配字符串^
  • 上述正则表达式将写为^(?!.*_C(\d+)?$)(?=.*_C)

答案 2 :(得分:0)

我会将正则表达式扩展为接受单词([0-9a-zA-Z _]):

re.compile('_C\w+$')

当然,这将接受任何字母或数字的组合。如果您只想将其限制为字母或数字,可以执行以下操作:

re.compile('_C(\d+|[a-zA-Z]+)$')

答案 3 :(得分:0)

让我们在这里颠倒逻辑。您正在搜索您不想要的内容并将其过滤掉。相反,为什么不搜索你想要的东西?

您的正则表达式可能如下所示:_C[A-Za-z]+[\D],其中:

  • _C是您需要的起始C
  • [A-Za-z]+不止一次匹配任何大写/小写字母
  • [\D]排除了字母后面的数字,从而避免匹配chromecar_CM123之类的内容。注意:大写\D是速记\d
  • 的否定

因此Python代码将变为:

import re

def regexer():
    name_list = ['chrome_PM', 'chrome_P', 'chromerocker_C', 'chromebike_P1', 
             'chromecar_CMale', 'chromeone_C1254']

    counts_tail = re.compile('_C[A-Za-z]+[\D]') # Build regexp here - no need to do it in the loop
    for name in name_list:
        if counts_tail.search(name):
            print name

以下是正则表达式:

enter image description here