猿问

删除所有与 Python 中的正则表达式模式不匹配的内容

我有一个正则表达式模式,用于标识一整列日期中的日期,但有些日期包含在一个字符串中,而有些则只是简单的日期本身。我的正则表达式模式完美地找到了每个日期,但现在我想能够说“删除不符合日期模式的所有内容”,这将删除某些日期之前或之后的文本。

我想要的东西的例子:

Mexico [12/20/1985] 如果我可以删除与模式不匹配的内容,那么括号和墨西哥就会消失

假设我的正则表达式模式是(我还有两个匹配更具体的日期格式,但不包括它们,因为这无关紧要:

pattern = (r"(19|20)\d\d")

我正在使用has_date = data.str.contains(pattern),它可以完美地找到我要找的东西。但是,现在我已经确定了具有我想要的日期的观察结果,我需要去除/删除/替换所有不是那种模式的东西。

我制作了一个文件,其中包含与正则表达式模式不匹配的内容以及匹配的内容,并检查以确保我的正则表达式模式包含所有内容,因此我在这方面做得很好。

有人对如何替换不是我的模式有任何建议吗?欢迎任何想法。谢谢


尚方宝剑之说
浏览 331回答 1
1回答

皈依舞

要解决您的确切问题,即替换与模式不匹配的所有内容,您可以使用df['Data'] = df['Data'].str.replace(r"(?s)((?:19|20)\d\d)?.", r"\1")请参阅正则表达式演示。在这里,(?s)将.匹配任何字符,((?:19|20)\d\d)?是一个可选的捕获组#1,它匹配19或匹配20任何 2 位数字 1 或 0 次,然后匹配任何带有.模式的字符。如果第 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字边界)。
随时随地看视频慕课网APP

相关分类

Python
我要回答