Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中提取字符串的部分_Python - Fatal编程技术网

在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)

我必须用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(',')

让我们使用正则表达式

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

与此匹配,第一个捕获组包含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的两个更高级的特性,而我坚持使用最基本的功能-