提取 [] 中的最后一个语句(正则表达式)



我正在尝试提取括号中的最后一条语句。但是,我的代码返回括号中的每个语句以及介于两者之间的所有语句。

例如:"你在做什么">

我想要"[正在]",但是当我运行re.search时,我得到了"[正在]你[正在]"。

我使用正则表达式运行 re.search,该表达式应该在括号(加上括号(中获取最后一条语句,没有别的。我也尝试在开始时添加 \s+ 希望可以修复它,但没有。

string = '[What] are you [doing]'
m = re.search(r'[.*?]$' , string)
print(m.group(0))

我应该只是[做]回来,但我得到了整个字符串。

re.findall(r'[(.+?)]', 'What [are] you [doing]')[-1]

['doing']

根据条件提取括号中的最后一条语句

import re
s = 'What [are] you [doing]'
m = re.search(r'.*([[^[]]+])', s)
res = m.group(1) if m else m
print(res)  # [doing]

您可以使用findall并获取最后一个索引

import re
string = 'What [are] you [doing]'
re.findall("[w{1,}]", string)[-1]

输出

'[doing]'

这也将适用于@MonkeyZeus在评论中发布的示例。如果最后一个值为空,则不应返回空值。例如

string = 'What [are] you []'

输出

'[are]'

您可以使用负前瞻模式来确保匹配的括号对后面没有另一对括号:

re.search(r'[[^]]*](?!.*[.*])', string).group()

或者,您可以使用.*来消耗所有前导字符,直到最后一个可能的匹配:

re.search(r'.*([.*?])', string).group(1)

给定string = 'abc [foo] xyz [bar] 123',上面的两个代码都会返回:'[bar]'

这将捕获括号中带有任何内容的括号段(不一定是字母或数字:任何符号/空格/等(:

import re
string = '[US 1?] Evaluate any matters identified when testing segment information.[US 2!]'
print(re.findall(r'[[^]]*]', string)[-1])

[US 2!]

对正则表达式的小修复。您不需要最后的$。并且还使用re.findall而不是re.search

import re
string = 'What [are] you [doing]'
re.findall("[.*?]", string)[-1]

输出:

'[doing]'

如果您的字符串中有空[],它也将通过上述方法计入输出。要解决此问题,请将正则表达式从[.*?]更改为[..*?]

import re
string = "What [are] you []"
re.findall("[..*?]", string)[-1]

输出:

'[are]'
如果没有

匹配,它将像所有其他答案一样抛出错误,因此您将不得不使用tryexcept

最新更新