簡體   English   中英

如何使用正則表達式從亂碼的文本中提取一些子文本模式?

[英]How can I extract some patterns of sub text from a gibberish looking text using regular expressions?

我有一些文字,其中某些記錄(並非全部)中提到了一個人的年齡和性別,例如28M35 F29 male57Female等等。

我編寫了以下正則表達式,以檢查是否有任何模式匹配輸入字符串中跟着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 F29Male57 female等一個)。 那是正確的方法嗎? 還是有辦法一次搜索/查找/匹配所有這些模式?

您可以使用此正則表達式來匹配您提到的所有情況:

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

正則演示

細節:

  • (?i) :忽略大小寫修飾符
  • (\\d+) :匹配並捕獲組#1中的1+個數字
  • \\s* :匹配0個或多個空格
  • ([mf]|(?:fe)?male) :匹配或捕獲#2組中的MFmalefemale
  • \\b :單詞邊界

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

嘗試以下重新

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM