Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式从DF中提取精确匹配_Regex_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Regex 使用正则表达式从DF中提取精确匹配

Regex 使用正则表达式从DF中提取精确匹配,regex,python-3.x,pandas,dataframe,Regex,Python 3.x,Pandas,Dataframe,我正在研究DF(文本),其中我需要从只包含月/年的文本中准确提取月/年,但当我应用此公式时,它也从dd/月/年中提取月/年,这也是我不想要的 e、 g Text1-5/24/1990 CPT代码:90792:医疗服务 Text2-自2014年10月起:疲劳,健忘,左手灵活性受损。MRI显示一个约4.2cm x 3.3cm x 2.5cm的右顶叶强化肿块,周围水肿 我只需要从DF中提取2014年10月,但当我应用此公式时,它会同时提取1990年24月和2014年10月 当文本中只提到年份时,我还需

我正在研究DF(文本),其中我需要从只包含月/年的文本中准确提取月/年,但当我应用此公式时,它也从dd/月/年中提取月/年,这也是我不想要的

e、 g

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

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

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

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

公式:

df['Text'].str.extractall(r'((?P<Month>\d{1,2})\/(?P<Year>\d{4}))')
df['Text'].str.extractall(r'((P\d{1,2})\/(P\d{4})))
那么:

((?<!\d/)(?<!\d)(?P<Month>\d{1,2})\/(?P<Year>\d{4}))
((?\d{1,2})\/(?\d{4}))
如所见

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

说明:
(?在正则表达式中是一个负的lookbehind,它确保匹配之前没有任何内容。在这里,我确保匹配之前没有数字或数字后面有斜杠,如何:

((?<!\d/)(?<!\d)(?P<Month>\d{1,2})\/(?P<Year>\d{4}))
((?\d{1,2})\/(?\d{4}))
如所见

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

说明:
(?是正则表达式中的一个负数lookbehind,它确保匹配之前没有任何内容。在这里,我确保匹配之前没有数字或数字后跟斜杠

说明:

(?-反向查找:断言前面的不是
/
\d
(任何数字)

\d{1,2}
-匹配一个或两个数字

\/
-按字面意思匹配
/

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

(?!\/\d)
-负前瞻:断言下面的内容不是
/
\d
(任何数字)

试试:

说明:

(?-反向查找:断言前面的不是
/
\d
(任何数字)

\d{1,2}
-匹配一个或两个数字

\/
-按字面意思匹配
/

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

(?!\/\d)
-负前瞻:断言下面的内容不是
/
\d
(任何数字)


该模式匹配月份的2位数字,而不是
\d{1,2}
我认为您也可以使用字符类
(?\d{1,2})/(?\d{4})(?![/\d])编写它
@Thefourthbird谢谢,更正。您对类的理解是正确的,这是我最初的想法,但环顾四周会提供更大的灵活性。此解决方案有三个问题:1)它无法与当前操作代码一起工作2)如果在
/
之前存在预期的匹配,则无法工作,3)如果有一年没有月份,它不会只提取一年。谢谢,我的问题已经解决。非常感谢您的帮助。@AnandJyesth您应该接受其中一个答案或发布自己的答案,以便将来有人可以从这个问题中受益。模式匹配月份的2位数字,而不是
\d{1,2}
我想你也可以使用字符类
(?\d{1,2})/(?P\d{4})(?![/\d])来编写它。
@Thefourthbird谢谢,更正了。你对类的理解是正确的,这是我最初的想法,但是lookarounds提供了更多的灵活性。这个解决方案有三个问题:1)它不能与当前的操作代码一起工作2)如果在
/
之前有一个预期匹配,它将不起作用,3)如果没有月份,它不会只提取一年。谢谢我的问题解决了。非常感谢你的帮助。@AnandJyesth你应该接受其中一个答案或发布你自己的答案,所以将来有人会从这个问题中受益。谢谢我的问题解决了。非常感谢你的帮助。@AnandJyesth如果有任何答案解决了你的问题,别忘了接受它作为正确答案,因为它可以很容易地帮助其他人解决类似的问题。谢谢,我的问题已经解决了。非常感谢你的帮助。@AnandJyesth如果有任何答案已经解决了你的问题,不要忘记接受它作为正确答案,因为它可以很容易地帮助其他人解决类似的问题。