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

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. И т.п.

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

1
horcle_buzz 20 Сен 2018 в 04:40

2 ответа

Лучший ответ

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

(\d+).*?(\d+$)

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

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

1
CertainPerformance 20 Сен 2018 в 01:54

Вы можете попробовать это:

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
Dani Mesejo 20 Сен 2018 в 01:54