正则表达式从字符串中查找具有不同格式的数字

时间:2019-06-25 00:39:31

标签: regex regex-group

我收到以下文字:

instance=hostname1, topic="AB_CD_EF_12345_ZY_XW_001_000001"
instance=hostname2, topic="AB_CD_EF_1345_ZY_XW_001_00001"
instance=hostname1, topic="AB_CD_EF_1235_ZY_XW_001_000001"
instance=hostname2, topic="AB_CD_EF_GH_4567_ZY_XW_01_000001"
instance=hostname1, topic="AB_CD_EF_35678_ZY_XW_001_00001"
instance=hostname2, topic="AB_CD_EF_56789_ZY_XW_001_000001"

我想从上面的示例中获取数字。我尝试使用下面的正则表达式来做到这一点,它们可以很好地用作单独的查询:

Regex: *.topic="AB_CD_EF_([^_]+).*    
Matches: 12345 1345 1235

Regex: *.topic="AB_CD_EF_GH_([^_]+).*
Matches: 4567 35678 56789

但是我需要一个可以给我所有数字的正则表达式,即:

12345 1345 1235 4567 35678 56789

4 个答案:

答案 0 :(得分:3)

LvProducts设为可选:

GH_

与您的所有目标号码匹配。

请参见live demo


您可以通过以下方式允许使用任意数量的“字母下划线”序列来更通用:

.*topic="AB_CD_EF_(GH_)?([^_]+).*

请参见live demo

答案 1 :(得分:1)

根据您给出的示例和条件,我认为您将需要一个非常严格的正则表达式,但这可能取决于您要如何适应它。查看以下正则表达式并阅读细分,以获取有关其功能的更多信息。使用第一组(此正则表达式中只有一个)作为替代,以检索您要查找的数字。

正则表达式

^instance\=hostname[0-9]+\,\s*topic\=\“[A-Z_]+([0-9]+)_[A-Z_]+[0-9_]+\”$

在此DEMO中尝试一下。

故障

^                # Asserts position at start of the line
hostname[0-9]+   # Matches any and all hostname numbers
\s*              # Matches whitespace characters (between 0 and unlimited times)
[A-Z_]+          # Matches any upper-case letter or underscore (between 1 and unlimited times)
([0-9]+)         # This captures the number you want
$                # Asserts position at end of the line

尽管这确实回答了您所提出的问题,但我担心这可能并非您要找的东西,但是如果没有进一步的信息,这是我能给您的最好的答案。无论如何,在您研究了故障并围绕演示进行了演示之后,它应该会有所帮助。

答案 2 :(得分:1)

我们可能会调用的另一个选项是类似于以下内容的表达式:

topic=".*?[A-Z]_([0-9]+)_.*?"

,我们想要的数字在此捕获组([0-9]+)中。

Please see the demo for additional explanation.

答案 3 :(得分:1)

正则表达式为我工作:

sys.stdout