如何使用正则表达式从乱码的文本中提取一些子文本模式?

时间:2019-05-23 07:29:34

标签: python regex python-3.x match

我有一些文本,其中某些记录(并非全部)中提到了一个人的年龄和性别,分别为28M35 F29 male或{{ 1}}等。

我编写了以下正则表达式,以检查输入字符串中是否有任何匹配数字的模式,后跟57Female,如果是,则将其打印出来,但是代码不打印任何内容:< / p>

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)28M35 F29Male等一个)。那是正确的方法吗?还是有一种方法可以一次搜索/查找/匹配所有这些模式?

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式来匹配您提到的所有情况:

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

RegEx Demo

详细信息:

  • (?i):忽略大小写修饰符
  • (\d+):匹配并捕获第1组中的1个以上数字
  • \s*:匹配0个或多个空格
  • ([mf]|(?:fe)?male):在#2组中匹配或捕获MFmalefemale
  • \b:单词边界

答案 1 :(得分:1)

您可以使用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'}]

答案 2 :(得分:0)

尝试以下重新操作

(\d\d)(M|F|Male|Female|\sM|\sF|\sMale|\sFemale)