Python фиксирует определенный шаблон внутри строки с помощью регулярных выражений

#python #regex #pattern-matching #extract

#python #регулярное выражение #сопоставление с шаблоном #извлечь

Вопрос:

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

Я пытался

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

но он возвращает
[«‘», ‘»‘, ‘ c’, ‘m’]

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

Комментарии:

1. Попробуйте (?<=()[^)] (?=)) или используйте группу захвата (s*([0-9] s*[a-z] )s*)

2. [0-9] или d

3. @Thefourthbird Большое вам спасибо, это сработало как по волшебству!

Ответ №1:

 print re.findall(r'[0-9]  cm',string)[0]
  

где string находится:

 '6' 3" ( 190 cm )'
  

Ответ №2:

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

Использование окружения [] 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'
  

Ответ №3:

С помощью регулярных выражений:

 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
  

Ответ №4:

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

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

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

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

демонстрация regex101 | Демонстрация Python

Например:

 import re

string = '6' 3" ( 190 cm )'
pattern = re.compile(r"(s*([0-9] s*[a-z] )s*)")
print(pattern.findall(string))