使用正则表达式从 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/1990
和 10/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
注意:这是最全面的解决方案,但也有比这更简单的方法,例如在可提取日期之前检查空格
说明:
(?<!)
是正则表达式中的负向回溯,可确保匹配之前没有某些内容。在这里,我确保匹配项前面没有数字或数字后跟斜线
【讨论】:
感谢我的问题已解决。非常感谢您的帮助。 @AnandJyesth 如果有任何答案解决了您的问题,请不要忘记接受它作为正确答案,因为它可以轻松帮助其他有类似问题的人。【参考方案2】:试试:(?<!\/|\d)\d1,2\/\d\d\d\d(?!\/|\d)
解释:
(?<!\/|\d)
- 否定的lookbehind:断言前面的不是/
或\d
(任何数字)
\d1,2
- 匹配一位或两位数字
\/
- 匹配 /
字面意思
\d\d\d\d
- 匹配四位数字
(?!\/|\d)
- 否定前瞻:断言后面的不是/
或\d
(任何数字)
Demo
【讨论】:
该模式匹配月份的 2 位数字而不是\d1,2
我认为您也可以使用字符类编写它(?<![/\d])(?P<Month>\d1,2)/(?P<Year>\d4)(?![/\d])
regex101.com/r/6LVjv5/1
@Thefourthbird 谢谢,已更正。你说得对,这是我最初的想法,但环顾四周提供了更大的灵活性。
此解决方案存在三个问题:1) 它不适用于当前的 OP 代码 2) 如果在 /
之前存在预期匹配,它将无法工作,3) 它不会如果有一年没有月,就只提取一年。
感谢我的问题已解决。非常感谢您的帮助。
@AnandJyesth 您应该接受其中一个答案或发布您自己的答案,以便将来有人可以从这个问题中受益。以上是关于使用正则表达式从 DF 中提取完全匹配的主要内容,如果未能解决你的问题,请参考以下文章