Конкретное регулярное выражение в Python - PullRequest
0 голосов
/ 26 января 2019

В python3 у меня есть строки формата:

some_string = 'perhaps here also 19/4986 something else 5/4 somehting else 7/4 and here'

Используя регулярное выражение, я хочу получить вывод:

output=['19/4986', '5/4', '7/4']

Моя (неудачная) попытка:

m = re.search('[[.]*?([0-9]+/[0-9]+)]*', some_string)

, а затем просмотр результатов с m.group (0), m.group (1), ...

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Просто используйте \d+/\d+:

>>> re.findall(r'\d+/\d+', 'perhaps here also 19/4986 something else 5/4 somehting else 7/4 and here')
['19/4986', '5/4', '7/4']

[.] Означает буквально ., но в вашей строке нет ..
Также внешнее [] кажетсябред ...

0 голосов
/ 26 января 2019

Ваше регулярное выражение [[.]*?([0-9]+/[0-9]+)]* неверно, так как вы использовали [ и ], который используется для классов символов, и все, что вы в него включаете, рассматривается как набор символов.

Как я вижуВы хотите найти все паттерны, имеющие одну или несколько цифр, за которыми следует косая черта, а затем снова одна или несколько цифр, поэтому вы можете использовать это регулярное выражение и вам не нужно циклически просматривать все результаты, вместо этого вы можете просто использовать findallфункция в re модуле

\d+/\d+

Демонстрация

Пример кода Python,

import re

some_string = 'perhaps here also 19/4986 something else 5/4 somehting else 7/4 and here'
output = re.findall(r'\d+/\d+',some_string)
print(output)

Печать,

['19/4986', '5/4', '7/4']

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

import re
some_string = 'perhaps here also 19/4986 something else 5/4 somehting else 7/4 and here'
for m in re.finditer(r'\d+/\d+',some_string):
 print(m.group())

Prints,

19/4986
5/4
7/4

Как видите, разница между findall иfinditer, findall - это удобная функция для захвата всех совпадений через одну строку кода в виде массива совпадающих строк, если есть одна группа захвата или нет группы захвата (в этом случае все совпадения), и если есть большечем одна группа захвата в регулярном выражении, то findall возвращает массив кортежей всех соответствующих групп в регулярном выражении.

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

Дайте мне знать по любым вопросам.

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