Регулярное выражение произвольного числа групп цифр с помощью ';' и '\ s' между группировками

1

У меня есть следующий код для извлечения первой и последней группы цифр в заданной строке в соответствии со случаями, описанными ниже. Он работает, но он не кажется оптимальным:

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 случая:

  1. Произвольное число слов, за которыми следуют цифры, а затем пробел, за которыми следуют цифры
  2. Произвольное число слов, за которыми следуют цифры, за которыми следует пробел, а затем цифры, разделенные символом ';' затем пробел с цифрами
  3. Произвольное число слов, за которыми следуют цифры, за которыми следует пробел, а затем цифры, разделенные символом ';' а затем пробел, за которым следуют цифры, разделенные символом ';' затем пробел с цифрами
  4. И т.п.

Любые предложения о том, как сделать это одним махом?

Теги:

2 ответа

1
Лучший ответ

Похоже, что общий шаблон - это то, что вы хотите найти начальную строку цифр и окончательную строку цифр. Ты можешь использовать

(\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()))

https://regex101.com/r/FgVIdV/1

0

Вы можете попробовать следующее:

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+ одно или несколько номеров
  • а затем необязательный ; ((;)?)
  • 0
    Мне нравится ваше решение, но приведенное выше является более общим для моего случая.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню