我正在尝试提取括号中的最后一条语句。但是,我的代码返回括号中的每个语句以及介于两者之间的所有语句。
例如:"你在做什么">
我想要"[正在]",但是当我运行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]'
匹配,它将像所有其他答案一样抛出错误,因此您将不得不使用try
和except