我有一个正则表达式模式,用于标识一整列日期中的日期,但有些日期包含在一个字符串中,而有些则只是简单的日期本身。我的正则表达式模式完美地找到了每个日期,但现在我想能够说“删除不符合日期模式的所有内容”,这将删除某些日期之前或之后的文本。我想要的东西的例子:Mexico [12/20/1985] 如果我可以删除与模式不匹配的内容,那么括号和墨西哥就会消失假设我的正则表达式模式是(我还有两个匹配更具体的日期格式,但不包括它们,因为这无关紧要:pattern = (r"(19|20)\d\d")我正在使用has_date = data.str.contains(pattern),它可以完美地找到我要找的东西。但是,现在我已经确定了具有我想要的日期的观察结果,我需要去除/删除/替换所有不是那种模式的东西。我制作了一个文件,其中包含与正则表达式模式不匹配的内容以及匹配的内容,并检查以确保我的正则表达式模式包含所有内容,因此我在这方面做得很好。有人对如何替换不是我的模式有任何建议吗?欢迎任何想法。谢谢
1 回答
皈依舞
TA贡献1851条经验 获得超3个赞
要解决您的确切问题,即替换与模式不匹配的所有内容,您可以使用
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
字边界)。
添加回答
举报
0/150
提交
取消