Python “如何在内部分组”;或;在正则表达式中匹配?
我需要分析两种文档:Python “如何在内部分组”;或;在正则表达式中匹配?,python,regex,Python,Regex,我需要分析两种文档: 1545994641 INFO: ... 及 我想从它们中提取时间戳1545994641 因此,我决定编写一个正则表达式来匹配这两种情况: (\d{10}\s|\"\d{10}\") 在第一类文档中,它匹配时间戳并使用上面“or”中的第一个表达式(\d{10}\s)对其进行分组: (到目前为止还不错。) 但是,在第二类中,使用“or”(\“\d{10}\”)中的第二个表达式,它匹配时间戳和引号,并对它们进行分组。但是我只想要时间戳,而不是”: 我的尝试: 我决定使用非捕
1545994641 INFO: ...
及
我想从它们中提取时间戳1545994641
因此,我决定编写一个正则表达式来匹配这两种情况:
(\d{10}\s|\"\d{10}\")
在第一类文档中,它匹配时间戳并使用上面“or”中的第一个表达式(\d{10}\s
)对其进行分组:
(到目前为止还不错。)
但是,在第二类中,使用“or”(\“\d{10}\”
)中的第二个表达式,它匹配时间戳和引号,并对它们进行分组。但是我只想要时间戳,而不是”
:
我的尝试:
我决定使用非捕获组作为引号:
(\d{10}\s|(?:\")\d{10}(?:\"))
但当外部群体抓住它们时,它就不起作用了
我还删除了外部组,但结果是一样的
不需要的解决方法:
- 我可以通过为or中的每个表达式创建一个组来超越这一点, 但我只希望它输出一个组(抽象代码) 来自正则表达式)
- 我还可以使用正则表达式的第二步从 有引号的组,但这将再次中断 代码抽象 RIX可以省略ReGEX中的<代码>“/CODE”,但这将匹配消息中间的时间戳,因为我希望它是客观的,将时间戳作为密钥的值或在文档的开头,后面跟着一个空间。
正如@Amit Bhardwaj所注意到的,第一个案例还返回时间戳后的一个空格。这是另一个问题(我没有弄明白)与相同的解决方案,可能 如果代码只能访问整个匹配项,则可以使用lookarounds:
^\d{10}(?=\s)|(?<=")\d{10}(?=")
^\d{10}(?=\s)|(?您可以使用lookarounds,但我认为这个解决方案更简单,如果您只需要获得以下组:
"?(\d{10})(?:\"|\s)
编辑:
考虑是否存在第一个“必须存在”,尝试以下方法:
(^\d{10}\s|(?<=\")\d{10}(?=\"))
(^\d{10}\s|)(?在第一种情况下,它也会在您的10位数字末尾获取\s
。您需要做的是从您的正则表达式中删除\“
前后搜索,以便只查找数字。@AmitBhardwaj感谢您的解答。刚才添加的内容是对文章的编辑!这将与的情况相匹配。”1234567890 blabla
。如果它有第一个引号,它就不能有空格。我认为这样它也会忽略第二个引号,如果第一个引号存在,它应该存在。@samthegolden试试我的解决方案。@samthegolden我在编辑中添加的那一个怎么样?它对你有用吗?@dquijada差不多了。现在它返回空格a在时间戳之后,正如我在帖子中作为一个新问题添加的那样。但它实际上解决了我的第一个问题!@samthegolden添加了第三个问题来解决这个问题,即使你可能已经发现它已经不起作用了,因为一开始的\b
。去掉它,它就起作用了!Thanks@samthegolden它能用,你用的和我说的一样吗wed?rx=r'\b\d{10}(?=\s)|(?可能我没有解释最好的方法。文档以时间戳开头,尽管我在regex@samthegolden如果必须有字符串的开头,请使用rx=r'^\d{10}(?=\s)|(?yes@Wiktor,我使用了您的第一个答案并添加了“^”
^\d{10}(?=\s)|(?<=")\d{10}(?=")
rx = r'^\d{10}(?=\s)|(?<=")\d{10}(?=")'
"?(\d{10})(?:\"|\s)
(^\d{10}\s|(?<=\")\d{10}(?=\"))
(^\d{10}(?=\s)|(?<=\")\d{10}(?=\"))