Попробуйте сопоставить строку с несколькими шаблонами в Python - PullRequest
1 голос
/ 17 мая 2019

Я пробую приведенный ниже код 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 голосов
/ 17 мая 2019

Первый аргумент re.match - это шаблон, и вы пытаетесь передать список.

Вы можете использовать одно регулярное выражение, используя чередование , соответствующее как одному, так и другому.

(?: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'
0 голосов
/ 17 мая 2019

Посмотрите, работает ли это для вас:

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;  

Внимание: это узкий ответ на ваше требование. если вы хотите быть более конкретным, рассмотрите альтернативный шаблон, чтобы избежать ненужных совпадений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...