我有两种文档要解析:
1545994641 INFO: ...
和
'{"deliveryDate":"1545994641","error"..."}'
我想1545994641
从它们每个中提取时间戳。
因此,我决定编写一个正则表达式来匹配两种情况:
(\d{10}\s|\"\d{10}\")
在第一种文档中,它使用(\d{10}\s
)上方“或”中的第一个表达式匹配时间戳并将其分组:
>>> regex = re.compile("(\d{10}\s|\"\d{10}\")")
>>> msg="1545994641 INFO: ..."
>>> regex.search(msg).group(0)
'1545994641 '
(到现在为止还挺好。)
但是,在第二种类型中,使用“或”(\"\d{10}\"
)中的第二个表达式将时间戳和引号进行匹配,将它们分组。但是我只想要时间戳,而不是""
:
>>> regex = re.compile("(\d{10}\s|\"\d{10}\")")
>>> msg='{"deliveryDate":"1545994641","error"..."}'
>>> regex.search(msg).group(0)
'"1545994641"'
我试过的
我决定对引号使用非捕获组:
(\d{10}\s|(?:\")\d{10}(?:\"))
但由于外部团体抓住了他们而没有用。
我也删除了外部组,但是结果是一样的。
不需要的解决方法:
""
在正则表达式中省略,但是它将与消息中间的时间戳匹配,因为我希望客观地将时间戳捕获为键的值或文档的开头,后跟一个空格。有没有办法我可以同时匹配以上两种情况,但是如果它与第二种情况匹配,则仅返回时间戳?还是不可能?
编辑: @Amit Bhardwaj注意到,第一种情况在时间戳记之后也返回一个空格。相同的解决方案可能是另一个问题(我没有弄清楚)!
如果您的代码只能访问整个匹配项,则可以使用环视方法:
^\d{10}(?=\s)|(?<=")\d{10}(?=")
请参阅regex演示。
在Python中,将其声明为
rx = r'^\d{10}(?=\s)|(?<=")\d{10}(?=")'
图案细节
^\d{10}(?=\s)
:
^
-字符串开始\d{10}
-十位数(?=\s)
-正向超前查询,需要在当前位置的右侧紧跟一个空白字符|
- 要么 (?<=")\d{10}(?=")
:
(?<=")
-一个"
字符\d{10}
-十位数(?=")
-正向前瞻,需要在当前位置的右边立即加上双引号。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句