我已经展示了输入字符串和我需要的输出字符串的示例。数字和字符串可以是任何顺序,并且可以包含任何数字或任何字符串(例如'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的延续。
答案 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}}