如何仅在特定字符串后匹配数字,如果找到非数字则停止匹配 - Python 27

时间:2016-12-30 16:40:03

标签: python regex python-2.7

我有像dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2

这样的巨大字符串

我想在ludocid之后得到数字,只有连续的数字。

我试过这个正则表达式(ludocid).*(?=\d+\d+)还有更多,但没有运气。

4 个答案:

答案 0 :(得分:3)

您可以尝试ludocid=(\d+)

s = "dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2"

import re
re.findall(r"ludocid=(\d+)", s)
# ['15878284988193842600']

答案 1 :(得分:3)

您可以使用此正则表达式:

ludocid\D*(\d+)

RegEx Demo

这将匹配文字ludocid后跟0或更多非数字,然后它将匹配捕获的组#1中的1位或更多位数

<强>代码:

>>> s = 'dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2'
>>> print re.search(r'ludocid\D*(\d+)', s).group(1)
15878284988193842600

答案 2 :(得分:2)

看起来你只是把一堆正则表达式的东西放在一起......让我们来解决这个问题。

首先,这是正确的正则表达式:ludocid.(\d+)

(顺便说一句,您希望将其与re.search而不是re.match一起使用。匹配要求正则表达式匹配整个字符串。)

但是,让我们看看你的,看看出了什么问题,以及我们如何才能找到正确的正则表达式。

(ludocid).*(?=\d+\d+)

想象一下正则表达式作为一个函数。你传递正确的东西,它会给你合适的结果。当你把东西括在括号中时,你会说&#34;找到这个并把它还给我。&#34;你不需要ludocid给你回复,我猜...所以删除那些paren。

ludocid.*(?=\d+\d+)

现在你有一个.*。这在正则表达式中是危险的,因为它实际上表示&#34;抓住尽可能多的任何东西!&#34;我经常使用非贪婪版本(.*?),但在这种情况下,我们似乎只期待一个额外的角色。如果您知道可以使用的文字字符,但为了安全起见,我会将其保留为.,其中包含&#34;抓取任何一个字符。&#34;

ludocid.(?=\d+\d+)

现在让我们进入括号。您已获得\d+\d+,其中显示&#34;查找一个或多个数字的序列,然后找到一个或多个数字的另一个序列。&#34;这相当于&#34;查找两个或更多数字的序列。&#34;我不认为这是你想要的(不管你怎么描述这个问题),所以让我们减少它:

ludocid.(?=\d+)

好的,太好了。现在...... (?=...)的内容是什么?它被称为先行断言。它说&#34;如果你找到这个字符串,匹配前面的东西。&#34; the Python 2.7 documentation中给出的示例是:

  

(?=...)

     

匹配如果...匹配下一个,但不消耗任何字符串。这称为先行断言。例如,Isaac (?=Asimov)只有在'Isaac '之后才匹配'Asimov'

基本上这意味着你的正则表达式永远不会返回数字。相反,它会查看是否存在数字,然后从正则表达式的其余部分返回内容。删除先行断言,我们就在那里:

ludocid.(\d+)

当您使用re.search时,您将获得所需的群组:

>>> s = "dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2"
>>> import re
>>> re.search(r"ludocid.(\d+)", s).group(1)
'15878284988193842600'

答案 3 :(得分:1)

要仅匹配后面的数字,停在第一个非数字字符处,请尝试正面看看:

(?<=ludocid=)(\d+)

所以:

re.findall(r"(?<=ludocid=)(\d+)", s)

背后的正面看起来会找到你想要的东西,只有在它前面有'flag'字符串时才匹配。

**注意:**您可能需要转义第二个=符号:(?<=ludocid\=)(\d+)