在python中提取字符串的部分
我必须用python解析输入字符串并从中提取某些部分 字符串的格式为在python中提取字符串的部分,python,Python,我必须用python解析输入字符串并从中提取某些部分 字符串的格式为 (xx,yyy,(aa,bb,...)) // Inner parenthesis can hold one or more characters in it 我想要一个函数返回xx,yyyy和一个包含aa,bb。。。等 当然,我可以尝试拆分括号和其他内容,但我想知道是否有合适的python方法从字符串中提取此类信息 我有这段代码可以工作,但是没有正则表达式有更好的方法吗 def processInput(inputStr)
(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(',')
让我们使用正则表达式
/\(([^,]+),([^,]+),\(([^)]+)\)\)/
与此匹配,第一个捕获组包含xx,第二个包含yyy,第三个拆分为on,您就有了您的列表。让我们使用正则表达式
/\(([^,]+),([^,]+),\(([^)]+)\)\)/
与此相匹配,第一个捕获组包含xx,第二个包含yyy,第三个拆分为on,您就有了您的列表。我不知道这是否更好,但这是另一种方式。使用之前建议的正则表达式
def processInput(inputStr):
value = [re.sub('\(*\)*','',i) for i in inputStr.split(',')]
return value[0], value[1], value[2:]
或者,您可以使用两个链式替换函数代替正则表达式 我不知道这是否更好,但这是另一种方式。使用之前建议的正则表达式
def processInput(inputStr):
value = [re.sub('\(*\)*','',i) for i in inputStr.split(',')]
return value[0], value[1], value[2:]
或者,您可以使用两个链式替换函数代替正则表达式 像这样怎么样
>>> import ast
>>> import re
>>>
>>> s="(xx,yyy,(aa,bb,ccc))"
>>> x=re.sub("(\w+)",'"\\1"',s)
# '("xx","yyy",("aa","bb","ccc"))'
>>> ast.literal_eval(x)
('xx', 'yyy', ('aa', 'bb', 'ccc'))
>>>
像这样怎么样
>>> import ast
>>> import re
>>>
>>> s="(xx,yyy,(aa,bb,ccc))"
>>> x=re.sub("(\w+)",'"\\1"',s)
# '("xx","yyy",("aa","bb","ccc"))'
>>> ast.literal_eval(x)
('xx', 'yyy', ('aa', 'bb', 'ccc'))
>>>
如果括号嵌套可以任意深,那么regexen就不行,您需要一个状态机或解析器。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
如果括号嵌套可以任意深,那么regexen就不行,您需要一个状态机或解析器。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
如果您对REs过敏,您可以使用:
pyparsing还可以轻松控制结果的确切形式,例如,如果需要,可以将最后3项分组到它们自己的子列表中。但我认为最好的方面是,根据你想在语法规范上投入多少空间,你可以让语法规范读起来有多自然:一个开括号、一个单词、一个逗号、一个单词、一个逗号、一个开括号、一个带分隔符的单词列表、两个闭括号,如果你觉得上面s的赋值不那么容易读,我想这是我的错,没有选择更长的标识符;- 如果您对REs过敏,您可以使用:
pyparsing还可以轻松控制结果的确切形式,例如,如果需要,可以将最后3项分组到它们自己的子列表中。但我认为最好的方面是,根据你想在语法规范上投入多少空间,你可以让语法规范读起来有多自然:一个开括号、一个单词、一个逗号、一个单词、一个逗号、一个开括号、一个带分隔符的单词列表、两个闭括号,如果你觉得上面s的赋值不那么容易读,我想这是我的错,没有选择更长的标识符;- 您的解决方案非常简单、高效。如果不信任数据源,可以使用正则表达式来限制语法
import re
parser_re = re.compile(r'\(([^,)]+),([^,)]+),\(([^)]+)\)')
def parse(input):
m = parser_re.match(input)
if m:
first = m.group(1)
second = m.group(2)
rest = m.group(3).split(",")
return (first, second, rest)
else:
return None
print parse( '(xx,yy,(aa,bb,cc,dd))' )
print parse( 'xx,yy,(aa,bb,cc,dd)' ) # doesn't parse, returns None
# can use this to unpack the various parts.
# first,second,rest = parse(...)
印刷品:
[['xx', 'yyy', ['aa', 'bb', '...']]]
[['xx', 'yyy', ['aa', 'bb', ['dd', 'ee'], 'ff', '...']]]
('xx', 'yy', ['aa', 'bb', 'cc', 'dd'])
None
您的解决方案相当简单、高效。如果不信任数据源,可以使用正则表达式来限制语法
import re
parser_re = re.compile(r'\(([^,)]+),([^,)]+),\(([^)]+)\)')
def parse(input):
m = parser_re.match(input)
if m:
first = m.group(1)
second = m.group(2)
rest = m.group(3).split(",")
return (first, second, rest)
else:
return None
print parse( '(xx,yy,(aa,bb,cc,dd))' )
print parse( 'xx,yy,(aa,bb,cc,dd)' ) # doesn't parse, returns None
# can use this to unpack the various parts.
# first,second,rest = parse(...)
印刷品:
[['xx', 'yyy', ['aa', 'bb', '...']]]
[['xx', 'yyy', ['aa', 'bb', ['dd', 'ee'], 'ff', '...']]]
('xx', 'yy', ['aa', 'bb', 'cc', 'dd'])
None
如果引用了内部值,您实际上可以对其进行求值,尽管我当然不推荐:如果引用了内部值,您实际上可以对其进行求值,尽管我当然不推荐:使用正则表达式绝对是一种好方法,有没有办法创建一个像sortof a reverse printf这样的表达式,并用它来提取所需的部分?C语言中有一个sscanf函数,但我不知道Python的标准库中是否有一个等价的函数。也许有人在第三方库中实现了它。使用regex绝对是一种好方法,是否有必要创建一个类似sortof a reverse printf的表达式并使用它来提取所需的部分?C中有一个sscanf函数,但我不知道Python的标准库中是否有一个等价的函数。也许有人在第三方库中实现了它。亚历克斯,你这个嘴硬的恶魔!我想我们可能会在一分钟内互相发布@保罗,是的,当我开始写我的文章时,你的文章不在那里,我很确定反过来也成立,所以我们一定是在同一时间写的!亚历克斯,你这个嘴甜的魔鬼!我想我们可能会在一分钟内互相发布@保罗,是的,当我开始写我的文章时,你的文章不在那里,我很确定反过来也成立,所以我们一定是在同一时间写的+1因为它展示了pyparsing的两个更高级的特性,而我坚持使用最基本的功能-+1因为它展示了pyparsing的两个更高级的特性,而我坚持使用最基本的功能-