Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅在特定字符串后匹配数字,如果找到非数字则停止匹配-Python 27_Python_Regex_Python 2.7 - Fatal编程技术网

如何仅在特定字符串后匹配数字,如果找到非数字则停止匹配-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+)

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

代码:

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

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

ludocid\D*(\d+)

这将匹配literal
ludocid
,后跟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断言,我们就可以: