Как я могу извлечь некоторые шаблоны подтекста из бессмысленно выглядящего текста, используя регулярные выражения? - PullRequest
1 голос
/ 23 мая 2019

У меня есть текст, в котором возраст и пол человека упоминается в некоторых записях (не во всех) как 28M, или 35 F, или 29 male, или 57Female и т. Д.

Я написал следующее регулярное выражение, чтобы проверить, существует ли какой-либо шаблон, который соответствует номеру, за которым следует M во входной строке, и если да, чтобы распечатать его, но код ничего не печатает:

import re

text = 'Decision: Standard\r\n\r\n 36M NS\r\nBasic - 500th MP tdb addd cib 250th\r\n\r\nDue Date: Settlement date'

test_search = re.search('[0-9]+M', text)

if test_search:
    print("Age: "+test_search.group(0)+", Gender: "+test_search.group(1))

Я ожидал, что он напечатал Age: 36, Gender: M. Тем не менее, он ничего не делает - ни ошибки, ни вывода, ничего.

Я пытался re.match('[0-9]+F', text), там тоже ничего не случилось.

Кроме того, я подумал, что мне нужно написать столько регулярных выражений, сколько шаблонов (по одному для 28M, 35 F, 29Male, 57 female и т. Д.). Это правильный подход? Или есть способ найти / найти / сопоставить все эти шаблоны одновременно?

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Вы можете использовать this regex ([0-9]+)\s?([M|Male|F|Female]+) и укажите возраст и имя в отдельных группах захвата.

Python Demo

import re

test_str = r"Decision: Standard\\r\\n\\r\\n 36M NS\\r\\nBasic - 500th MP tdb addd cib 250th\\r\\n\\r\\nDue Date: Settlement date 29 male 57Female 35 F"

pattern = r"([0-9]+)\s?([M|Male|F|Female]+)"

def return_gender_dict(match_obj):
    return { 'age': match_obj[0], 'gender': match_obj[1][0].upper() }

matches = re.findall(pattern, test_str, flags=re.MULTILINE | re.IGNORECASE)

result = [return_gender_dict(match) for match in matches]

print(result)

Выведение:

[{'age': '36', 'gender': 'M'}, {'age': '29', 'gender': 'M'}, {'age': '57', 'gender': 'F'}, {'age': '35', 'gender': 'F'}]
1 голос
/ 23 мая 2019

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

results = re.findall(r'(?i)(\d+)\s*([mf]|(?:fe)?male)\b', text)

RegEx Demo

подробности:

  • (?i): игнорировать модификатор регистра
  • (\d+): сопоставить и перехватить 1+ цифр в группе № 1
  • \s*: совпадение 0 или более пробелов
  • ([mf]|(?:fe)?male): сопоставить или захватить M или F или male или female в группе № 2
  • \b: граница слова
0 голосов
/ 23 мая 2019

Попробуйте следующее:

(\d\d)(M|F|Male|Female|\sM|\sF|\sMale|\sFemale)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...