我需要匹配字符串值列表。我正在使用'|'。join()构建一个传递给re.match的sting:
import re
line='GigabitEthernet0/1 is up, line protocol is up'
interfacenames=[
'Loopback',
'GigabitEthernet'
]
rex="r'" + '|'.join(interfacenames) + "'"
print rex
interface=re.match(rex,line)
print interface
代码结果是:
r'Loopback|GigabitEthernet'
None
但是,如果我将字符串直接复制到匹配中:
interface=re.match(r'Loopback|GigabitEthernet',line)
有效:
r'Loopback|GigabitEthernet'
<_sre.SRE_Match object at 0x7fcdaf2f4718>
我确实尝试用rex中的实际“Loopback | GigabitEthernet”替换.join,但它也没有用。从字符串传递时,管道符号看起来不会被视为运算符。 有任何想法如何解决它?
答案 0 :(得分:2)
您使用r'
前缀作为字符串文字的一部分。这是如何使用的:
rex=r'|'.join(interfacenames)
请参阅Python demo
如果 interfacenames 可能包含特殊的正则表达式元字符,请转义以下值:
rex=r'|'.join([re.escape(x) for x in interfacenames])
此外,如果您计划不仅在字符串的开头匹配字符串,请使用re.search
而不是re.match
。见What is the difference between Python's re.search and re.match?
答案 1 :(得分:1)
您不需要将"r'"
放在开头"'"
。这是文字原始字符串语法的一部分,它不是字符串本身的一部分。
rex = '|'.join(interfacenames)