Python正则表达式分割逗号或空格分隔的字符串

时间:2015-09-04 16:32:30

标签: python regex string

我已经展示了输入字符串和我需要的输出字符串的示例。数字和字符串可以是任何顺序,并且可以包含任何数字或任何字符串(例如'THIS'可以是其他字符串)

我需要以下输出

["'5'", "'THIS'", "'/,'", "'4.2560'", "'0.34000E-01'"]

表示所有后续输入字符串:

""" 5,'THISMORETHAN4','/,',4.2560,0.34000E-01 """
""" 5,'THIS','/,',4.2560,0.34000E-01 """
"""5 , 'THIS' , '/,' , 4.2560 , 0.34000E-01 """
""" '5'  'THIS' '/,' '4.2560' '0.34000E-01' """
""" 5,'THIS','this','/,',4.2560,0.34000E-01 """
""" 5,'THIS','/,',4.2560,0.34000E-01 """

这是previous question的延续。

  1. 字符串可以逗号分隔或空格分隔。可能有 或者在分裂逗号之前或之后可能不是空格。
  2. 单引号中的子字符串可能包含特殊字符(例如'/,',如上所示)

2 个答案:

答案 0 :(得分:0)

作为上一个问题的Padraic Cunningham解决方案的改进版本,正则表达式(["']).*?\1(?<!\\["'])|[^\r\n\t\f ,]+将捕获您的所有字段。

第一部分((["']).*?\1(?<!\\["']))现在也适用于'asdf"'等字段,因为周围的引号字符必须相同。它也适用于转义引号,因为(?<!\\["'])断言在第二个引号之前没有反斜杠。

如果第一部分不匹配(即没有用引号括起的字符串),则第二部分([^\r\n\t\f ,]+)匹配不是空格或逗号的所有内容。因此,它会忽略您的分隔符,但会匹配其他所有内容。

import re

rows = [""" 5,'THISMORE"THAN4','/,',4.2560,0.34000E-01 """,
        #              ^ added quote character here
        """ 5,'TH\\'IS','/,',4.2560,0.34000E-01 """,
        #          ^ added escaped quote here
        """5 , 'THIS' , '/,' , 4.2560 , 0.34000E-01 """,
        """ '5'  'THIS' '/,' '4.2560' '0.34000E-01' """,
        """ 5,'THIS','this','/,',4.2560,0.34000E-01 """,
        """ 5,'THIS','/,',4.2560,0.34000E-01 """]

pattern = re.compile(r'(["\']).*?\1(?<!\\["\'])|[^\r\n\t\f ,]+')

result = [[m.group(0).strip('"\'') for m in pattern.finditer(row)]
          for row in rows]

import pprint
pprint.pprint(result)

打印:

[['5', 'THISMORE"THAN4', '/,', '4.2560', '0.34000E-01'],
 ['5', "TH\\'IS", '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', 'this', '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', '/,', '4.2560', '0.34000E-01']]

仍然存在问题的是不带引号的字段,其中包含逗号分隔的行内的空格。因此

'hello there, "I actually", have, 5, fields'

将导致:

['hello','there','I actually','have','5','fields']

你的数据中有吗?

答案 1 :(得分:-1)

此正则表达式适用于所有测试用例

{{1}}