使用正则表达式从 DF 中提取完全匹配

Posted

技术标签:

【中文标题】使用正则表达式从 DF 中提取完全匹配【英文标题】:Extract exact match from DF using regex 【发布时间】:2020-05-18 22:06:12 【问题描述】:

我正在研究 DF(Text),我需要从仅包含月/年的文本中准确提取月和年,但是当我应用此公式时,它也会从 dd/月/年中提取月/年,而我也没有不想。

例如

Text1 -5/24/1990 CPT 代码:90792:医疗服务

Text2 - 自 2014 年 10 月起:左手疲劳、健忘、灵巧受损。 MRI 显示一个约 4.2cm x 3.3cm x 2.5cm 的右侧顶叶强化肿块,周围水肿。

我只需要从 DF 中提取 10/2014,但是当我应用此公式时,它会同时提取 24/199010/2014

当文本中只提到年份时,我还需要从同一 DF 的文本中仅提取年份。

公式:

df['Text'].str.extractall(r'((?P<Month>\d1,2)\/(?P<Year>\d4))')

【问题讨论】:

【参考方案1】:

怎么样:

((?<!\d/)(?<!\d)(?P<Month>\d1,2)\/(?P<Year>\d4))

如所见here

注意:这是最全面的解决方案,但也有比这更简单的方法,例如在可提取日期之前检查空格

说明:

(?&lt;!) 是正则表达式中的负向回溯,可确保匹配之前没有某些内容。在这里,我确保匹配项前面没有数字或数字后跟斜线

【讨论】:

感谢我的问题已解决。非常感谢您的帮助。 @AnandJyesth 如果有任何答案解决了您的问题,请不要忘记接受它作为正确答案,因为它可以轻松帮助其他有类似问题的人。【参考方案2】:

试试:(?&lt;!\/|\d)\d1,2\/\d\d\d\d(?!\/|\d)

解释:

(?&lt;!\/|\d) - 否定的lookbehind:断言前面的不是/\d(任何数字)

\d1,2 - 匹配一位或两位数字

\/ - 匹配 / 字面意思

\d\d\d\d - 匹配四位数字

(?!\/|\d) - 否定前瞻:断言后面的不是/\d(任何数字)

Demo

【讨论】:

该模式匹配月份的 2 位数字而不是 \d1,2 我认为您也可以使用字符类编写它(?&lt;![/\d])(?P&lt;Month&gt;\d1,2)/(?P&lt;Year&gt;\d4)(?![/\d]) regex101.com/r/6LVjv5/1 @Thefourthbird 谢谢,已更正。你说得对,这是我最初的想法,但环顾四周提供了更大的灵活性。 此解决方案存在三个问题:1) 它不适用于当前的 OP 代码 2) 如果在 / 之前存在预期匹配,它将无法工作,3) 它不会如果有一年没有月,就只提取一年。 感谢我的问题已解决。非常感谢您的帮助。 @AnandJyesth 您应该接受其中一个答案或发布您自己的答案,以便将来有人可以从这个问题中受益。

以上是关于使用正则表达式从 DF 中提取完全匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式匹配和提取数据

正则表达式从字符串中提取用逗号分隔的字符串

如何使用 Vim 提取匹配正则表达式的文本?

Swift 提取正则表达式匹配

Swift 提取正则表达式匹配

使用正则表达式从 pandas 数据框中提取元素