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

Есть хороший способ сделать на Python:

  • Проверка строки соответствует набору регулярных выражений
  • Если да, верните соответствующие части в виде кортежей.

По сути, я хочу простой способ ввести простые грамматики синтаксического анализатора / сканера и просто извлечь все совпадения в определенной структуре (например, кортежи)

Итак, предположим, что мы зашифровали в строке код страны, название города и индекс. Мы хотим извлечь это:

input = "123-NEWYORK-[2]"
grammar = "<country,[0-9]+>-<city,[A-Z]*>-[<index,[0-9]*>"
res = HOW_TO_DO_THIS(input,grammar)
if res is None:
  print("Does not match")
else
  (countrycode,city,index) = res

2 ответа

Решение

С python3 вы можете сделать это, обратите внимание, что регулярное выражение было изменено:

import re
input = "123-NEWYORK-[2]"
grammar = r"(?P<country>[0-9]+)-(?P<city>[A-Z]*)-(?P<index>\[[0-9]*\])"
res = re.findall(grammar, input)
if not res:
  print("Does not match")
else:
  (countrycode,city,index) = res[0]
  print(countrycode)

Модификации:

  • Правильное регулярное выражение будет (?P[0-9]+)-(?P[AZ]) - (? P [[0-9]])
  • Синтаксис для модуля регулярных выражений в Python re.findall(patter, input_string), Не наоборот.
  • if not x легче (и более общий), чем if x is None

Проверьте этот код. Это просто для простого поиска текста, но вы можете расширить в соответствии с вашим сценарием

import re
f=open('sample.txt',"w")
f.write("<p class = m>babygameover</p>")
f.close()
f=open('sample.txt','r')
string = "<p class = m>(.+?)</p>" # regular expression
pattern = re.compile(string) # compiling
text = f.read()
search = re.findall(pattern,text) # searching 
print search
Другие вопросы по тегам