Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Regex_String_Split - Fatal编程技术网

Python:按模式分割字符串

Python:按模式分割字符串,python,regex,string,split,Python,Regex,String,Split,我的问题是另一个问题。我似乎无法理解这一点 given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq" expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"] 如上例所示,预期中的项目可以是{…,…}或另一个字符串 非常感谢。以下内容是否提供了您需要的信息 import re given = "{abc, xyz}, 123, {def, lmn, ijk}, {u

我的问题是另一个问题。我似乎无法理解这一点

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"]
如上例所示,
预期
中的项目可以是
{…,…}
或另一个
字符串


非常感谢。

以下内容是否提供了您需要的信息

import re
given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
expected = re.findall(r'(\w+)', given)
我在终端运行了该程序,得到:

>>> import re
>>> given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
>>> expected = re.findall(r'(\w+)', given)
>>> expected
['abc', 'xyz', '123', 'def', 'lmn', 'ijk', 'uvw', 'opq']

以下内容是否不能为您提供所需内容

import re
given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
expected = re.findall(r'(\w+)', given)
我在终端运行了该程序,得到:

>>> import re
>>> given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
>>> expected = re.findall(r'(\w+)', given)
>>> expected
['abc', 'xyz', '123', 'def', 'lmn', 'ijk', 'uvw', 'opq']

我认为下面的regexp适合这项工作。然而,不管怎样,你不必有嵌套的花括号(据我所知,嵌套的花括号不能用正则表达式解析)


我认为下面的regexp适合这项工作。然而,不管怎样,你不必有嵌套的花括号(据我所知,嵌套的花括号不能用正则表达式解析)


您可以使用下面的正则表达式来实现这一点。Rest与您提供的类似链接相同

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
regex = r",?\s*(\{.*?\}|[^,]+)"

print re.findall(regex,given)

OP: ['{abc, xyz}', '123', '{def, lmn, ijk}', '{uvw}', 'opq']
只需导入
re
模块。并按照链接所说的做。
它将匹配大括号内的任何内容{}和任何字符串。

您可以使用下面的正则表达式来实现这一点。Rest与您提供的类似链接相同

given = "{abc, xyz}, 123, {def, lmn, ijk}, {uvw}, opq"
regex = r",?\s*(\{.*?\}|[^,]+)"

print re.findall(regex,given)

OP: ['{abc, xyz}', '123', '{def, lmn, ijk}', '{uvw}', 'opq']
given = "{abc,{a:b}, xyz} , 123 , {def, lmn, ijk}, {uvw}, opq"
#expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"]
tmp_l = given.split(',')
tmp_l = [i.strip() for i in tmp_l]
result_l = []
element = ''
count = 0
for i in tmp_l:
    if i[0] == '{':
        count += 1
    if i[-1] == '}':
        count -= 1
    element = element + i + ','
    if count == 0:
        element = element[0:-1]
        result_l.append(element)
        element = ''

print str(result_l)
只需导入
re
模块。并按照链接所说的做。 它将匹配大括号
{
}
内的任何内容和任何字符串

given = "{abc,{a:b}, xyz} , 123 , {def, lmn, ijk}, {uvw}, opq"
#expected = ["{abc, xyz}", "123", "{def, lmn, ijk}", "{uvw}", "opq"]
tmp_l = given.split(',')
tmp_l = [i.strip() for i in tmp_l]
result_l = []
element = ''
count = 0
for i in tmp_l:
    if i[0] == '{':
        count += 1
    if i[-1] == '}':
        count -= 1
    element = element + i + ','
    if count == 0:
        element = element[0:-1]
        result_l.append(element)
        element = ''

print str(result_l)
这一个可以处理嵌套的花括号,虽然它看起来不那么优雅


这一个可以处理嵌套的花括号,尽管它看起来不那么优雅。

如果花括号可以嵌套,则不能使用正则表达式(至少不能使用其“纯”形式)拆分它,因为它不是上下文无关的语法。如果花括号可以嵌套,则不能使用正则表达式拆分它(至少不能使用其“纯”形式)表单),因为它不是上下文无关的语法。可能值得注意的是,为什么嵌套的花括号可能无法使用正则表达式求解……正如上面提到的@shx2,带有嵌套花括号的语言是上下文无关的,需要下推自动机解算。Python中的正则表达式或多或少是正则语言的实现,由有限自动机解析,因此功能不太强大。@Xavier_Combelle谢谢!我想把:
\{.*?\}
改为
\{[^}]*\}
。它避免了非贪婪匹配(可能会更慢),并且即使字符串包含换行符也会匹配。您当前的解决方案无法匹配
{abc\nxyz}
之类的内容。可能值得注意的是,为什么嵌套的花括号可能无法使用正则表达式解决……正如上面@shx2所指出的,带有嵌套花括号的语言是上下文无关的,需要下推自动机来解决。Python中的正则表达式或多或少是正则语言的实现,由有限自动机解析,因此功能不太强大。@Xavier_Combelle谢谢!我想把:
\{.*?\}
改为
\{[^}]*\}
。它避免了非贪婪匹配(可能会更慢),并且即使字符串包含换行符也会匹配。您当前的解决方案无法匹配像
{abc\nxyz}
这样的内容。这不是问题,例如,如果“abc”和“xyz”在同一组括号中,它们不应该是单独的单词。这不是问题,如果“abc”和“xyz”在同一组括号中,它们不应该是单独的单词,例如,你需要re.findall某处你所拥有的只是一个tupleHe已经给出了解释其余部分的链接。难道你不需要re.findall吗?在某个地方,你所拥有的只是一个tupleHe已经给出了解释其余部分的链接。不是吗