目的是打印不以"_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"?
答案 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
以下是正则表达式: