在Python中提取字符串的部分内容

1 投票
6 回答
2883 浏览
提问于 2025-04-16 00:39

我需要在Python中解析一个输入字符串,并从中提取某些部分。

这个字符串的格式是:

(xx,yyy,(aa,bb,...)) // Inner parenthesis can hold one or more characters in it

我想要一个函数来返回xx、yyyy,以及一个包含aa、bb等的列表。

当然,我可以通过尝试分割括号等方式来实现,但我想知道有没有更合适的Python方法来从字符串中提取这些信息。

我有一段代码可以实现这个功能,但有没有更好的方法(不使用正则表达式)呢?

def processInput(inputStr):
    value = inputStr.strip()[1:-1]
    parts = value.split(',', 2)
    return parts[0], parts[1], (parts[2].strip()[1:-1]).split(',')

6 个回答

2

我们来用正则表达式吧!

/\(([^,]+),([^,]+),\(([^)]+)\)\)/

先进行匹配,第一个捕获组里包含xx,第二个捕获组里包含yyy,第三个部分用,来分割,这样你就得到了你的列表。

3

如果你的括号嵌套层数可以非常深,那么正则表达式就不够用了,你需要一个状态机或者一个解析器。Pyparsing这个库支持使用前向声明类Forward来处理递归语法。

from pyparsing import *

LPAR,RPAR,COMMA = map(Suppress,"(),")
nestedParens = Forward()
listword = Word(alphas) | '...'
nestedParens << Group(LPAR + delimitedList(listword | nestedParens) + RPAR)

text = "(xx,yyy,(aa,bb,...))"
results = nestedParens.parseString(text).asList()
print results

text = "(xx,yyy,(aa,bb,(dd,ee),ff,...))"
results = nestedParens.parseString(text).asList()
print results

输出结果:

[['xx', 'yyy', ['aa', 'bb', '...']]]
[['xx', 'yyy', ['aa', 'bb', ['dd', 'ee'], 'ff', '...']]]
3

如果你对正则表达式过敏,可以试试 pyparsing

>>> import pyparsing as p
>>> ope, clo, com = map(p.Suppress, '(),')
>>> w = p.Word(p.alphas)
>>> s = ope + w + com + w + com + ope + p.delimitedList(w) + clo + clo
>>> x = '(xx,yyy,(aa,bb,cc))'
>>> list(s.parseString(x))
['xx', 'yyy', 'aa', 'bb', 'cc']

pyparsing 还可以让你轻松控制结果的具体形式(比如,把最后三个项目放到一个子列表里),如果你想的话。不过我觉得最棒的地方是,它的“语法规则”看起来很自然(这取决于你想花多少空间来写这些规则):一个左括号,一个单词,一个逗号,一个单词,一个逗号,一个左括号,一个用分隔符分开的单词列表,最后两个右括号(如果你觉得上面给 s 赋值的方式不太好理解,那可能是我没有选择更长的名字造成的;-)。

撰写回答