Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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 获取匹配的数字以及结果_Python_Regex - Fatal编程技术网

Python 获取匹配的数字以及结果

Python 获取匹配的数字以及结果,python,regex,Python,Regex,我有一个正则表达式: a_list = re.compile(r'\(\d+\)\s*\n').split(content) 它的工作伟大的匹配线(数字)在最后,但我需要得到那个数字以及 我该怎么做 谢谢。如上所述,正则表达式上的split方法将拆分正则表达式模式的所有匹配项正在处理的字符串。现在,您的正则表达式正在捕获所有结尾有数字的匹配项,并拆分该匹配项上的字符串。因此,一个_列表包含每一行中包含数字的所有内容,除了数字及其周围的括号(和可选空格) 假设您不想拆分所有换行符(只需将正则表达

我有一个正则表达式:

a_list = re.compile(r'\(\d+\)\s*\n').split(content)
它的工作伟大的匹配线(数字)在最后,但我需要得到那个数字以及

我该怎么做

谢谢。

如上所述,正则表达式上的split方法将拆分正则表达式模式的所有匹配项正在处理的字符串。现在,您的正则表达式正在捕获所有结尾有数字的匹配项,并拆分该匹配项上的字符串。因此,一个_列表包含每一行中包含数字的所有内容,除了数字及其周围的括号(和可选空格)

假设您不想拆分所有换行符(只需将正则表达式设置为“\n””),则可以使用仅捕获与正则表达式的匹配项,其中另一个正则表达式位于匹配项之前,但不将第二个正则表达式的匹配项包含在结果中。其格式为
(?当且仅当x短语正在进行时,y的所有实例都将被捕获,但x短语不会随它一起被包含

在这种情况下使用反向查找的唯一问题是,它需要匹配固定数量的字符,但您有
\d+
,可以是任意数量的字符。幸运的是,您可以删除
+
以及前导的
\(
以便您检查您的正则表达式模式之前是否至少有一个数字,以便我们只检查
\d\)
;这是有效的,因为我们不关心行是否以
(10000)
(1)
结尾

不幸的是,这将导致捕获像
(abc123)
这样的行,这与您最初拥有的
\(\d+\)
正则表达式不匹配。如果您需要确保行以括号结尾,而括号中只包含多位数a,则可能必须使用多个正则表达式操作

这就留下了
\s*
的问题,因此您有两个选择。如果您知道末尾将有多少空格,您可以创建or表达式,例如
(\d|\d\s)
,或者您可以将
\s*
包含在与换行符的匹配中,从而删除任何尾随空格

假设您选择后一个选项,您的示例将类似于
(?),这将导致一个包含所有行的列表,其中包括在末尾包含数字的行,以及数字本身(及其周围的括号).

如上所述,正则表达式上的split方法将拆分正则表达式模式的所有匹配项正在处理的字符串。现在,正则表达式将捕获结尾有数字的所有匹配项,并拆分该匹配项上的字符串。因此,在每一行中,一个_列表包含除数字及其su之外的所有包含数字的内容r括号(和可选空格)

假设您不想拆分所有换行符(只需将正则表达式设置为“\n”
”),您可以使用仅捕获与正则表达式的匹配项,其中另一个正则表达式位于匹配项之前,但不将第二个正则表达式的匹配项包含在结果中。其格式为
(?当且仅当x短语正在进行时,y的所有实例都将被捕获,但x短语不会被包括在内

在这种情况下使用反向查找的唯一问题是,它需要匹配固定数量的字符,但您有
\d+
,可以是任意数量的字符。幸运的是,您可以删除
+
以及前导的
\(
以便您检查您的正则表达式模式之前是否至少有一个数字,以便我们只检查
\d\)
;这是有效的,因为我们不关心行是否以
(10000)
(1)
结尾

不幸的是,这将导致捕获像
(abc123)
这样的行,这与您最初拥有的
\(\d+\)
正则表达式不匹配。如果您需要确保行以括号结尾,而括号中只包含多位数a,则可能必须使用多个正则表达式操作

这就留下了
\s*
的问题,因此您有两个选择。如果您知道末尾将有多少空格,您可以创建or表达式,例如
(\d|\d\s)
,或者您可以将
\s*
包含在与换行符的匹配中,从而删除任何尾随空格


假设您选择后一个选项,您的示例将类似于
(?),这将导致一个包含所有行的列表,其中包括在末尾包含数字的行,以及数字本身(及其周围的括号).

使用
split
函数可能需要look-behind断言,不幸的是,look-behind需要固定宽度模式(这是@Thunderforge已经尝试过的)。我的解决方案使用
findall

re.findall(r'(.*?\(\d+\))\s*\n', content, re.S)
注:

  • flag
    re.S
    使“.”匹配任何字符,包括 新线
  • *?
    表示非贪婪匹配
但此解决方案仍然存在缺陷。如果
内容
没有以数字和“\n”结尾,则最后一部分将被丢弃。我们可以通过列表理解或生成器表达式来解决此问题,即:

[i or j for i, j in re.findall(r'(.*?\(\d+\))\s*\n|(.+)', content, re.S)]
或:


使用
split
函数可能需要look-behind断言,不幸的是,look-behind需要固定宽度模式(这是@Thunderforge已经尝试过的)。我的解决方案使用
findall

re.findall(r'(.*?\(\d+\))\s*\n', content, re.S)
注:

  • flag
    re.S
    使“.”匹配任何字符,包括 新线
  • *?
    表示非贪婪匹配
但此解决方案仍然存在缺陷。如果
内容
没有以数字和“\n”结尾,则最后一部分将被丢弃。我们可以通过列表理解或生成器表达式来解决此问题,即:

[i or j for i, j in re.findall(r'(.*?\(\d+\))\s*\n|(.+)', content, re.S)]
或:


你能举个例子吗?你能举个例子吗