尝试在python中使用多种模式匹配字符串

时间:2019-05-17 16:37:12

标签: regex python-2.7

我正在尝试以下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'

2 个答案:

答案 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不匹配。

请注意转义点\.以使其与字面值匹配。

Regex demo | Python demo

例如:

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'