Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “如何在内部分组”;或;在正则表达式中匹配?_Python_Regex - Fatal编程技术网

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}(?=\"))