有人知道为什么我的正则表达式的第一部分不能用Python工作吗?

2024-09-30 22:22:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在RegexBuddy里测试了这个regex

,[A-Z\s]+?,(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?

它似乎能够做我需要它做的事情-捕获一段数据,它看起来像以下之一:

,粉末,RO,ML,8/19/2002
,粉末,RO,,,,
,粉末,RO,,2002年8月19日
,粉末,RO,ML,,

当我在python字符串中使用它时:

r",[A-Z\s]+?,(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?"

它错过了匹配的第一部分,我得到的匹配结果如下:RO,ML,8/19/2002,或RO,ML,或jusr RO

第一个标记是存储为all caps的单词,其中可能有空格(和/或我需要很快说明的标点符号)。如果我删除空格,它仍然不能捕获它应该捕获的一个单词的名称。我错过什么明显的东西了吗?你知道吗


Tags: ro单词fsmllaregexcaun
3条回答

是的。你没有捕获第一组。你知道吗

r",([A-Z\s]+),(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?"
#  ^        ^ 

顺便说一句,您似乎正在用regex解析CSV文件。在Python中,已经有了^{} module。你知道吗

正则表达式的第一部分没有捕获括号。尝试正则表达式:

,([A-Z\s]+?),(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?
 #^^ This was [A-Z\s]+?; needs to be ([A-Z\s]+?)

在python中是这样的:

r",([A-Z\s]+?),(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?"

口译员举例:

>>> import re
>>> r = re.compile(r",[A-Z\s]+?,(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?")
>>> r.match(",POWDER,RO,ML,8/19/2002").groups()
('RO', 'ML', '8/19/2002')
>>> r = re.compile(r",([A-Z\s]+?),(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?")
>>> r.match(",POWDER,RO,ML,8/19/2002").groups()
('POWDER', 'RO', 'ML', '8/19/2002')

我不喜欢python,但是您忘记了使用括号来表示您想要捕获该部分:

,([A-Z\s]+)?,(LA|RO|MU|FE|AV|CA),(ML|FE|MN|FS|UN)?,(\d+/\d+/\d{4})?应该做你想做的事

相关问题 更多 >