[英]Remove everything that doesn't match regex patterns in Python
我有一個正則表達式模式,可以在整個日期列中標識日期,但是某些日期包含在字符串中,而某些日期本身只是純日期。 我的正則表達式模式可以完美地找到每個日期,但是現在我希望能夠說出“刪除所有不適合日期模式的內容”,這將擺脫某些日期之前或之后的文本。
我想要的東西示例:
Mexico [12/20/1985]
如果我可以刪除與模式不匹配的內容,那么括號和墨西哥將消失
說我的正則表達式模式是(我還有兩個可以匹配更具體的日期格式,但不包括它們,因為這是重點:
pattern = (r"(19|20)\\d\\d")
我正在使用has_date = data.str.contains(pattern)
,它可以完美地找到我想要的東西。 但是,既然我已經確定了具有所需日期的觀測值,那么我就需要剝離/刪除/替換所有不屬於該模式的內容。
我制作了一份與正則表達式模式不匹配以及哪些不匹配的文件,並檢查以確保我的正則表達式模式包含了所有內容,因此我在這方面很好。
有人對如何替換不是我的圖案的方法有任何建議嗎? 歡迎任何想法。 謝謝
為了解決您的確切問題,即替換所有與模式不匹配的內容,您可以使用
df['Data'] = df['Data'].str.replace(r"(?s)((?:19|20)\d\d)?.", r"\1")
參見regex演示 。
在這里, (?s)
將成為.
匹配任何字符, ((?:19|20)\\d\\d)?
是一個可選的捕獲組#1,它匹配19
或20
,然后匹配任意2位數字1或0次,然后將任何char與匹配.
圖案。 如果第1組匹配,由於\\1
反向引用,它將被放回到結果中。
但是,似乎您只想從數據中提取年份,如果沒有年份,則只獲取一個空字符串,因此請使用
df['Data'] = df['Data'].str.extract(r'\b((?:19|20)\d{2})\b', expand=False).fillna('')
\\b((?:19|20)\\d{2})\\b
將匹配19
或20
,然后匹配整個單詞中的任何兩位數字(由於\\b
單詞邊界)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.