У меня есть следующий код для извлечения первой и последней группы цифр в заданной строке в соответствии со случаями, описанными ниже. Он работает, но он не кажется оптимальным:
import re
# case 1
pattern = '\d+\ \d+'
string = 'Hello 999 888999'
test = re.findall(pattern, string, flags=0)[0].split()
print('{0}, {1}'.format(test[0], test[len(test)-1]))
# case 2
pattern = '\d+\ \d+;\d+ \d+'
string = 'How are things 999 888999;222 444'
test = re.findall(pattern, string, flags=0)[0].split()
print('{0}, {1}'.format(test[0], test[len(test)-1]))
# case 3
pattern = '\d+\ \d+;\d+ \d+;\d+ \d+'
string = 'It is nice 999 888999;222 444;33 55'
test = re.findall(pattern, string, flags=0)[0].split()
print('{0}, {1}'.format(test[0], test[len(test)-1]))
# case 4
pattern = '\d+\ \d+;\d+ \d+;\d+ \d+;\d+ \d+'
string = 'Please help yourself 999 888999;222 444;33 55;44 6661'
test = re.findall(pattern, string, flags=0)[0].split()
print('{0}, {1}'.format(test[0], test[len(test)-1]))
4 случая:
Любые предложения о том, как сделать это одним махом?
Похоже, что общий шаблон - это то, что вы хотите найти начальную строку цифр и окончательную строку цифр. Ты можешь использовать
(\d+).*?(\d+$)
для совпадения и захвата как можно большего числа цифр, lazy-repeat любого символа, пока вы не перейдете к другой строке цифр, за которой следует конец строки.
pattern = re.compile(r'(\d+).*?(\d+$)')
for str in ['Hello 999 888999', 'How are things 999 888999;222 444', 'It is nice 999 888999;222 444;33 55', 'Please help yourself 999 888999;222 444;33 55;44 6661']:
match = re.search(pattern, str)
print(', '.join(match.groups()))
Вы можете попробовать следующее:
import re
pattern = re.compile('(\d+\s\d+(;)?){1,4}')
texts = ['Hello 999 888999', 'How are things 999 888999;222 444', 'It is nice 999 888999;222 444;33 55',
'Please help yourself 999 888999;222 444;33 55;44 6661']
for text in texts:
match = pattern.search(text)
if match:
split = match.group().split()
print('{0}, {1}'.format(split[0], split[len(split) - 1]))
Выход
999, 888999
999, 444
999, 55
999, 6661
Regex
Повторите шаблон (\d+\s\d+(;)?){1,4}
1, 2, 3 или 4 раза. Шаблон почти такой же, как у вас:
\d+
Один или несколько номеров\s
одно место\d+
одно или несколько номеров;
((;)?
)