我正在尝试以下python代码并收到错误。我想要的是,如果target_branch匹配testrel变量中的任何模式,则应该说是。 target_branch的值可能采用release / 1.0.0或r11_i12格式,因此,如果它与任何模式匹配,则说是,否则什么也没有。是否可以按照以下方式定义多个模式?
import re
testrel = ['r(\d+)_(i\d+)', 'release/\d+.\d+.\d+']
target_branch = "r11_i12"
if re.match(testrel, target_branch):
print 'Yes'
错误:
Traceback (most recent call last):
File "test.py", line 8, in <module>
if re.match(testrel, target_branch):
File "C:\Python27\Lib\re.py", line 137, in match
return _compile(pattern, flags).match(string)
File "C:\Python27\Lib\re.py", line 229, in _compile
p = _cache.get(cachekey)
TypeError: unhashable type: 'list'
答案 0 :(得分:0)
看看这是否适合您:
import re
testrel = r'^r[\w+\/.]*'
target_branch = ["r11_i12",
"release/1.0.0",
"release/4.8.0",
"r11_i13",]
for x in target_branch:
if re.match(testrel, x):
print('Yes', end = '; ')
# Output:
## Yes; Yes; Yes; Yes;
警告:这是对您的要求的狭窄回答。如果您想更具体一些,请考虑使用其他模式以避免不必要的匹配。
答案 1 :(得分:0)
re.match的第一个参数是模式,您正在尝试传递列表。
您可以使用一个alternation来匹配一个正则表达式。
(?:r\d+_i\d+|release/\d+\.\d+\.\d+)$
re.match在字符串的开头开始匹配,因此您不需要^
锚点,但是您可以添加一个锚点$
来断言字符串的结尾,以便示例release/4.8.0 text
不匹配。
请注意转义点\.
以使其与字面值匹配。
例如:
import re
testrel = r"(?:r\d+_i\d+|release/\d+\.\d+\.\d+)$"
target_branches = ["r11_i12", "release/4.8.0"]
for target_branch in target_branches:
if re.match(testrel, target_branch):
print 'Yes'