Python3 RE匹配字符或行尾没有字符

时间:2018-09-07 19:32:50

标签: python regex

我有一行文本需要从中提取一个子字符串,该子字符串后面可能有也可能没有字符。 例子:

Robin Hood viewed item "something.mov" (99.12345.567891011)

或...

Robin Hood viewed item "something.mov" (88.123.456789101) some other stuff.

我需要拉出括号内的子字符串。子字符串将始终是由两个句点分隔的三组数字。引号后面带有.mov的字符串也可以包含任意字符,因此搜索应始终从该行的末尾开始。

如果在结束括号后面有字符,那么该行的末尾将有一个.。如果在结束括号后面没有字符,那么该行的末尾将没有.

现在我有:

mo = re.search(r'(\d[\d.]*)\).*$', data1)

但是,这在某些比赛中中断。问题是我正在使用的工具(Matillion)不会吐出失败的信息,所以我不知道为什么。

3 个答案:

答案 0 :(得分:0)

在进一步调查中,我发现在我要查找的子字符串之后,子字符串中永远不会有parens,因此我只是使用str.rfind()隔离了我想要的东西。

答案 1 :(得分:0)

这似乎应该可行:

mo = re.search(r'\((\d+\.\d+\.\d+)\)'), data1);

这将匹配一个开头括号,由.分隔的3组数字和一个结尾括号。这些数字集将在捕获组1中。

如果只想匹配该行的最后一组括号,则可以使用:

mo = re.search(r'\((\d+\.\d+\.\d+)\)[^()]*$'), data1);

[^()]*$确保该集合与行尾之间不再有括号。

答案 2 :(得分:0)

此正则表达式应该有效:.*\((\d+\.\d+\.\d+)\)

我添加了一个前缀,该前缀消耗下一组之前的所有字符,因此最后一次出现\((\d+\.\d+\.\d+)\)之前的所有字符都将被忽略。这以不同于$的方式断言行尾的位置。

https://regex101.com/r/vuED26/1