我正在使用 python 和正则表达式(两者都是新的)来查找字符串中的字符序列,如下所示: 获取 p 的第一个实例,后跟任意数字(它始终采用 p_ _ 的形式,其中 _ 和 _ 为整数)。然后找到“s”或“go”,然后找到所有整数,直到字符串末尾。例如:
ascjksdcvy<strong>p12nbvnzxcmgonbmbh12hjg23
应该产生 p12 go 12 23。
ascjksdcvy<strong>p12nbvnzxcmsnbmbh12hjg23
应该产生 p12 s 12 23。
我只设法获取字符串的 p12 部分,这是我迄今为止尝试提取“go”或“s”的方法:
decoded = (re.findall(r'([p][0-9]*)',myStr))
print(decoded) //prints p12
我知道通过做类似的事情
re.findall(r'[s]|[go]',myStr)
会给我所有出现的s、g和o,但类似的东西不是我想要的。我不确定如何组合这些正则表达式来获得所需的输出。
最佳答案
使用re.findall
使用模式分组:
>>> string = 'ascjksdcvyp12nbvnzxcmgonbmbh12hjg23'
>>> re.findall(r'(p\d{2}).*(s|go)\D*(\d+)(?:\D*(\d+))*', string)
[('p12', 'go', '12', '23')]
>>> string = 'ascjksdcvyp12nbvnzxcmsnbmbh12hjg23'
>>> re.findall(r'(p\d{2}).*(s|go)\D*(\d+)(?:\D*(\d+))*', string)
[('p12', 's', '12', '23')]
与
re.findall
我们只愿意得到模式分组匹配的()
p\d{2}
匹配p
之后的任意两位数字之后
.*
匹配任何内容那么,
s|go
匹配s
或go
\D*
匹配任意数量的非数字\d+
表示一位或多位数字(?:)
是一个非捕获组,即内部的匹配不会出现在输出中,它只是为了对标记进行分组
注意:
>>> re.findall(r'(p\d{2}).*(s|go)(?:\D*(\d+))+?', string)
[('p12', 's', '12')]
>>> re.findall(r'(p\d{2}).*(s|go)(?:\D*(\d+))+', string)
[('p12', 's', '23')]
我想使用上述两者之一,因为匹配后面的数字是一种重复的任务,但非贪婪和贪婪匹配都存在问题,因此我们需要匹配 s
之后的数字或go
嗯,有点明确。
关于Python 正则表达式 : finding sequence of chars inside a string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250035/