假设我有一个字符串'gfgfdAAA1234ZZZuijjk',我想提取'1234'部分。

我只知道在AAA之前的几个字符,以及在ZZZ之后的我感兴趣的部分1234。

使用sed,可以对字符串执行如下操作:

echo "$STRING" | sed -e "s|.*AAA\(.*\)ZZZ.*|\1|"

结果是1234。

如何在Python中做同样的事情?


当前回答

Python 3.8中保证文本包含子字符串的一行代码:

text[text.find(start:='AAA')+len(start):text.find('ZZZ')]

其他回答

令人惊讶的是,没有人提到这是我的一次性脚本的快速版本:

>>> x = 'gfgfdAAA1234ZZZuijjk'
>>> x.split('AAA')[1].split('ZZZ')[0]
'1234'
>>> s = '/tmp/10508.constantstring'
>>> s.split('/tmp/')[1].split('constantstring')[0].strip('.')

以防有人要做和我一样的事。我必须在一行中提取圆括号内的所有内容。例如,如果我有这样一句话,‘美国总统(巴拉克·奥巴马)会见了……,我只想得到“巴拉克·奥巴马”,这是解决方案:

regex = '.*\((.*?)\).*'
matches = re.search(regex, line)
line = matches.group(1) + '\n'

也就是说,你需要用斜杠\符号来阻止括号。尽管这是一个关于更多正则表达式的问题。

此外,在某些情况下,你可能会在正则表达式定义之前看到'r'符号。如果没有r前缀,你需要像在c中那样使用转义字符。这里有更多关于这个的讨论。

如果没有匹配则返回其他字符串的一行。 编辑:改进版本使用next函数,如果需要,将“not-found”替换为其他内容:

import re
res = next( (m.group(1) for m in [re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk" ),] if m), "not-found" )

我的另一个方法来做这个,不太理想,使用regex第二次,仍然没有找到一个更短的方法:

import re
res = ( ( re.search("AAA(.*?)ZZZ", "gfgfdAAA1234ZZZuijjk") or re.search("()","") ).group(1) )

使用PyParsing

import pyparsing as pp

word = pp.Word(pp.alphanums)

s = 'gfgfdAAA1234ZZZuijjk'
rule = pp.nestedExpr('AAA', 'ZZZ')
for match in rule.searchString(s):
    print(match)

收益率:

[[1234]]