У меня есть следующие три строки:
inputs = [
"Season 12",
"Season 1a",
"Season 1-2"
]
Я пытаюсь соответствовать только первому. Вот текущее регулярное выражение, которое у меня есть:
outputs = []
for input in inputs:
output = re.search(r'(Staffel|Season|Saison|S\.?)?\s?(\d{0,})(?!(-|[a-z][A-Z]))', input, re.IGNORECASE).group(2)
outputs.append(output)
assert(outputs == ['12','',''])
# AssertionError, values were ['12', '1', '']
В настоящее время это работает для Season 12
, Season 1-2
, но не для Season 1a
(ничего не должно возвращаться).
Можете ли вы просто завершить поиск с помощью $
? ^(Staffel|Season|Saison|S\.?)?\s?(\d*)$
@FailSafe из приведенного выше примера, да. Я должен добавить еще несколько входных данных для нескольких более сложных ситуаций, таких как «Сайнфельд, сезон 1 (UHD)» — так что в основном все после числа, но перед пробелом.
Хммм, вы хотите, чтобы это соответствовало Seinfeld, Season 1
или вы хотите соответствовать Seinfeld, Season 1 (UHD)
? Не уверен, что вы имели в виду под "все после числа, но перед пробелом"
import re
inputs = [
"Season 12",
"Season 1a",
"Season 1-2",
"Seinfeld, Season 1 (UHD)"
]
re_num = re.compile(
r'(Staffel|Season|Saison|S\.?)\s?((\d+)$|(\d+)\s)',
flags=re.IGNORECASE
)
for s in inputs:
m = re_num.search(s)
if m:
print(s, '-->', m.group(2))
результат:
Season 12 --> 12
Seinfeld, Season 1 (UHD) --> 1
Не уверен, что вы хотите для Seinfeld, Season 1 (UHD)
. Здесь он захвачен, но если вы этого не хотите, измените последнюю часть с (?:\s|$)
на простой $
import re
inputs = [
"Season 12",
"Season 1a",
"Season 1-3",
"Seinfeld, Season 1 (UHD)",
"Seinfeld, Season 1"
]
outputs = []
for input in inputs:
output = re.search(r'(?:Staffel|Season|Saison|S\.?)?\s(\d+)(?:\s|$)', input, re.IGNORECASE)
if (output != None):
outputs.append(output.group(1))
else:
outputs.append('')
print(outputs)
assert(outputs == ['12','','','1','1'])
Выход:
['12', '', '', '1', '1']
Почему бы просто не указать, что за ним следуют только цифры. Я имею в виду на основе вашего примера.
(Staffel|Season|Saison[\s]*?[\d]+)