如何仅在特定字符串后匹配数字,如果找到非数字则停止匹配-Python 27
我有这样的大字符串如何仅在特定字符串后匹配数字,如果找到非数字则停止匹配-Python 27,python,regex,python-2.7,Python,Regex,Python 2.7,我有这样的大字符串dsdasdludocid=158782884988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011eb625a8,2 我想得到ludocid之后的数字,只能是连续的数字 我已经尝试过这个正则表达式(ludocid)。*(?=\d+\d+和更多,但是运气不好。你可以尝试ludocid=(\d+: 您可以尝试ludocid=(\d+): 您可以使用此正则表达式: ludocid\D*(\d+) 这将匹配literalludocid,后跟0
dsdasdludocid=158782884988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011eb625a8,2
我想得到ludocid之后的数字,只能是连续的数字
我已经尝试过这个正则表达式(ludocid)。*(?=\d+\d+
和更多,但是运气不好。你可以尝试ludocid=(\d+
:
您可以尝试ludocid=(\d+)
:
您可以使用此正则表达式:
ludocid\D*(\d+)
这将匹配literalludocid
,后跟0个或更多非数字,然后匹配捕获组#1中的1个或更多数字
代码:
>>> s = 'dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2'
>>> print re.search(r'ludocid\D*(\d+)', s).group(1)
15878284988193842600
您可以使用此正则表达式:
ludocid\D*(\d+)
这将匹配literalludocid
,后跟0个或更多非数字,然后匹配捕获组#1中的1个或更多数字
代码:
>>> s = 'dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2'
>>> print re.search(r'ludocid\D*(\d+)', s).group(1)
15878284988193842600
要仅匹配后面的数字,请在第一个非数字字符处停止,然后尝试正面查看:
(?<=ludocid=)(\d+)
(?若要仅匹配后面的数字,请在第一个非数字字符处停止,尝试正面查看后面的内容:
(?<=ludocid=)(\d+)
(?看起来您刚刚将一堆正则表达式位组合在一起……让我们来研究一下
首先,这是正确的正则表达式:ludocid.(\d+)
(顺便说一下,您可能希望将它与re.search
一起使用,而不是与re.match
一起使用。match需要正则表达式来匹配整个字符串。)
但让我们看看你的,看看哪里出了问题,我们如何才能得到正确的正则表达式
(ludocid)。*(?=\d+\d+
想象一个正则表达式作为一个函数。你把正确的东西传递给它,它会给你适当的结果。当你把东西用括号括起来时,你会说“找到这个并把它还给我。”我猜你不需要把ludocid
还给你,所以去掉那些paren
ludocid.*(=\d+\d+)
现在你有了一个*
。这在正则表达式中是危险的,因为它字面上说“尽可能多地抓取任何东西!”我经常使用非贪婪版本(*?
),但在本例中,我们似乎只需要一个额外的字符。如果您知道文本字符,您可以使用它,但为了安全起见,我将其保留为
,它表示“获取任意一个字符”
ludocid.(?=\d+\d+
现在让我们进入括号。你有\d+\d+
,上面写着“找到一个由一个或多个数字组成的序列,然后再找到另一个由一个或多个数字组成的序列”。这等同于“找到一个由两个或多个数字组成的序列”。我认为这不是你想要的(不管怎样,这不是你描述问题的方式),所以让我们减少这一点:
ludocid.(?=\d+)
好的,很好。现在…什么是(?=…)
?它被称为前瞻断言。它说“如果你找到这个字符串,匹配它前面的内容。”中给出的示例是:
(?=…)
如果..
匹配next,则匹配,但不使用任何字符串。这称为前瞻断言。例如,Isaac(?=Asimov)
仅当后跟'Asimov'
时才会匹配'Isaac'
从本质上说,这意味着您的正则表达式永远不会返回数字。相反,它会查看数字是否存在,然后从正则表达式的其余部分返回内容。删除lookahead断言,我们就可以:
ludocid.(\d+)
当您将其与re.search
一起使用时,您将获得所需的组:
>>> s = "dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2"
>>> import re
>>> re.search(r"ludocid.(\d+)", s).group(1)
'15878284988193842600'
看起来你只是把一堆正则表达式放在一起…让我们来研究一下
首先,这是正确的正则表达式:ludocid.(\d+)
(顺便说一下,您可能希望将它与re.search
一起使用,而不是与re.match
一起使用。match需要正则表达式来匹配整个字符串。)
但让我们看看你的,看看哪里出了问题,我们如何才能得到正确的正则表达式
(ludocid)。*(?=\d+\d+
想象一个正则表达式作为一个函数。你把正确的东西传递给它,它会给你适当的结果。当你把东西用括号括起来时,你会说“找到这个并把它还给我。”我猜你不需要把ludocid
还给你,所以去掉那些paren
ludocid.*(=\d+\d+)
现在你有了一个*
。这在正则表达式中是危险的,因为它字面上说“尽可能多地抓取任何东西!”我经常使用非贪婪版本(*?
),但在本例中,我们似乎只需要一个额外的字符。如果您知道文本字符,您可以使用它,但为了安全起见,我将其保留为
,它表示“获取任意一个字符”
ludocid.(?=\d+\d+
现在让我们进入括号。你有\d+\d+
,上面写着“找到一个由一个或多个数字组成的序列,然后再找到另一个由一个或多个数字组成的序列”。这等同于“找到一个由两个或多个数字组成的序列”。我认为这不是你想要的(不管怎样,这不是你描述问题的方式),所以让我们减少这一点:
ludocid.(?=\d+)
好的,很好。现在…什么是(?=…)
?它被称为前瞻断言。它说“如果你找到这个字符串,匹配它前面的内容。”中给出的示例是:
(?=…)
如果..
匹配next,则匹配,但不使用任何字符串。这称为前瞻断言。例如,Isaac(?=Asimov)
仅当后跟'Asimov'
时才会匹配'Isaac'
从本质上说,这意味着您的正则表达式永远不会返回数字。相反,它会查看数字是否存在,然后从正则表达式的其余部分返回内容。删除lookahead断言,我们就可以: