如何在正则表达式中匹配“或”内部?

时间:2018-12-28 11:51:36

标签: python regex

我要解析两种文档:

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注意到的,第一种情况在时间戳记之后也返回一个空格。相同的解决方案可能是另一个问题(我没有弄清楚)!

2 个答案:

答案 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}(?=\"))
相关问题