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)]
或:
你能举个例子吗?你能举个例子吗