我要解析两种文档:
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注意到的,第一种情况在时间戳记之后也返回一个空格。相同的解决方案可能是另一个问题(我没有弄清楚)!
答案 0 :(得分:1)
如果您的代码只能访问整个匹配项,则可以使用环视方法:
^\d{10}(?=\s)|(?<=")\d{10}(?=")
请参见regex demo。
在Python中,将其声明为
rx = r'^\d{10}(?=\s)|(?<=")\d{10}(?=")'
模式详细信息
^\d{10}(?=\s)
:
^
-字符串开头\d{10}
-十位数(?=\s)
-正向超前,需要立即在当前位置的右侧添加一个空白字符|
-或(?<=")\d{10}(?=")
:
(?<=")
-一个"
字符\d{10}
-十位数(?=")
-正向超前,需要在当前位置的右边立即加上双引号。答案 1 :(得分:1)
您可以使用环顾四周,但我认为,如果您可以直接找到小组,则此解决方案会更简单:
"?(\d{10})(?:\"|\s)
编辑:
考虑是否有第一个“必须有一个”,请尝试以下操作:
(^\d{10}\s|(?<=\")\d{10}(?=\"))
编辑2:
要在最后也删除尾随空格,也请提前使用:
(^\d{10}(?=\s)|(?<=\")\d{10}(?=\"))