Python захватывает определенный шаблон внутри строки с регулярными выражениями - PullRequest
0 голосов
/ 02 марта 2019

У меня есть такая строка '6\' 3" ( 190 cm )', и я хотел бы извлечь '190 cm' только с использованием регулярных выражений.Я не могу найти подходящий шаблон для поиска.

Я пробовал

string = '6\' 3" ( 190 cm )'
pattern = re.compile(r'[^\\( 0-9+ \\)]')
pattern.findall(a)

, но он возвращает ["'",' "',' c ',' m ']

Спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 02 марта 2019
print re.findall(r'[0-9]+ cm',string)[0]

, где string:

'6\' 3" ( 190 cm )'
0 голосов
/ 02 марта 2019

С регулярными выражениями:

import re

s = '6\' 3" ( 190 cm )'
desired_output = re.search(r'\((.*?)\)',s).group(1).lstrip()

print(desired_output)
>>> 190 cm

Без регулярных выражений:

s = '6\' 3" ( 190 cm )'
desired_output = s[s.find("(")+1:s.find(")")].lstrip()

print(desired_output)
>>> 190 cm
0 голосов
/ 02 марта 2019

Вы можете использовать группу захвата, которая будет возвращена findall :

\(\s*([0-9]+\s*[a-z]+)\s*\)

Это будет соответствовать:

  • \(\s* match ( и 0+ раз символ пробела
  • ( Группа захвата
    • [0-9]+\s*[a-z]+ Совпадение с 1+ цифрой, 0+ раз символ пробела и 1+ раз az (или используйте cm вместо [a-z]+, если вы хотите сопоставить это буквально)
  • ) Закрыть группу захвата
  • \s*\) Совпадение 0+ с пробелом

regex101 demo | Python demo

Например:

import re

string = '6\' 3" ( 190 cm )'
pattern = re.compile(r"\(\s*([0-9]+\s*[a-z]+)\s*\)")
print(pattern.findall(string))
0 голосов
/ 02 марта 2019

слишком много ненужных и вредных символов в вашем выражении.

Использование окружающих [] made findall соответствует отдельным символам, что объясняет вывод, который вы получаете.

Для этого требуетсяполное переосмысление: экранируйте скобки, используйте \d+ для соответствия одной или нескольким цифрам, а также явные cm и пробелы.

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

import re
string = '6\' 3" ( 190 cm )'
pattern = re.compile(r'\( (\d+ cm) \)')

>>> pattern.search(string).group(1)
'190 cm'
...