我有像dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2
我想在ludocid
之后得到数字,只有连续的数字。
我试过这个正则表达式(ludocid).*(?=\d+\d+)
还有更多,但没有运气。
答案 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+)
这将匹配文字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+)