通过正则表达式将字符串拆分为列表

时间:2018-02-16 11:36:21

标签: python regex parsing

我需要一个正则表达式,它使用下一个规则将输入字符串拆分为列表:
1)用点;
2)如果是引号,请不要拆分表达式 例子:

'a.b.c' -> ['a', 'b', 'c'];
'a."b.c".d' -> ['a', 'b.c', 'd'];
'a.'b.c'.d' -> ['a', 'b.c', 'd'];
'a.'b c'.d' -> ['a', 'b c', 'd'];

4 个答案:

答案 0 :(得分:1)

您可以使用以下表达式来使用较新的regex模块:

\b

这会捕获引号,将它们匹配到下一个引号并让匹配的部分失败。交替是点。

<小时/> 在(["']).*?\1(*SKIP)(*FAIL)|\.

Python

哪个收益

import regex as re

data = """
a.b.c
a."b.c".d
a.'b.c'.d
a.'b c'.d
"""

rx = re.compile(r"""(["']).*?\1(*SKIP)(*FAIL)|\.""")

for line in data.split("\n"):
    if line:
        parts = [part.strip("'").strip('"') for part in rx.split(line) if part]
        print(parts)

a demo on regex101.com

<小时/> 如果您想坚持使用['a', 'b', 'c'] ['a', 'b.c', 'd'] ['a', 'b.c', 'd'] ['a', 'b c', 'd'] 模块,您可以替换之前的点,然后通过替换进行拆分。

re

这产生与上面完全相同的输出。请注意,这两种方法都不适用于转义引号。

答案 1 :(得分:0)

你可以在这里做一些额外的努力,你怎么做。

首先用'。'拆分然后做一些逻辑上的工作。

string_data = 'a."b.c".d'
data = string_data.split('.')

list = []
value = None
for i in range(0,len(data)):    
    if value:
        value = None
    else:
        if '"' in data[i]:
            value = data[i]
            value = value + '.' + data[i+1]
        if value:
            list.append(value)
        else:
            list.append(data[i])
print(list)

它会为你提供与qus相同的输出。

答案 2 :(得分:0)

作为替代方案,您可以尝试使用或|带有正面的后置(?<=和正向前瞻(?=的单引号和双引号

(?<=").*?(?=")|(?<=').*?(?=')|[a-z]+

regex = r"(?<=\").*?(?=\")|(?<=').*?(?=')|[a-z]+"
line = "a.\"b.t\".qq.d.d.'d'.'d.g.r'.d.d"
print(re.findall(regex, line))
  

['a','b.t','qq','d','d','d','。','dgr','d','d']

Test output python

答案 3 :(得分:-1)

这是一个regex for you

\.?([^\"\'\.]+)|\"(.+)\"|\'(.+)\'\.?

实现:

import re
regex = re.compile( r"""\.?([^\"\'\.]+)|\"(.+)\"|\'(.+)\'\.?""")

def str2list(string):
    b = regex.findall(string)
    l = []
    for i in list(b):
        for j in list(i):
            if j:
                l.append(j)
    return l

str2list('a.b.c')
str2list('a."b.c".d')
str2list("a.'b.c'.d")

输出:

['a', 'b', 'c']
['a', 'b.c', 'd']
['a', 'b.c', 'd']