我是正则表达式的新手,并且在re.split功能方面存在问题。
在我的情况下,分裂必须关注“特殊逃脱”。
文字应该在;
分隔,但有一个前导?
。
修改:在这种情况下,不应拆分这两部分,并且必须删除?
。
这是一个例子和我希望的结果:
import re
txt = 'abc;vwx?;yz;123'
re.split(r'magical pattern', txt)
['abc', 'vwx;yz', '123']
到目前为止,我尝试过这些尝试:
re.split(r'(?<!\?);', txt)
得到了:
['abc', 'vwx?;yz', '123']
遗憾地导致未消耗的?
麻烦,以下列表理解对性能至关重要:
[part.replace('?;', ';') for part in re.split(r'(?<!\?);', txt)]
['abc', 'vwx;yz', '123']
有没有“快速”的方法来重现这种行为?
re.findall函数可以成为解决方案吗?
例如此代码的扩展版本:
re.findall(r'[^;]+', txt)
我正在使用python 2.7.3。
期待你的感谢!
答案 0 :(得分:5)
正则表达式不是这项工作的工具。请改用csv
模块:
>>> txt = 'abc;vwx?;yz;123'
>>> r = csv.reader([txt], delimiter=';', escapechar='?')
>>> next(r)
['abc', 'vwx;yz', '123']
答案 1 :(得分:0)
你不能用一个正则表达式做你想做的事。在拆分后取消?;
是一项单独的任务,而不是在同时拆分时可以让re
模块为您完成的任务。
将任务分开;你可以用一台发电机为你做无意义的事情:
def unescape(iterable):
for item in iterable:
yield item.replace('?;', ';')
for elem in unescape(re.split(r'(?<!\?);', txt)):
print elem
但这不会比你的列表理解更快。
答案 2 :(得分:0)
我会这样做:
re.sub('(?<!\?);',r'|', txt).replace('?;',';').split('|')
答案 3 :(得分:0)
试试这个: - )
def split( txt, sep, esc, escape_chars):
''' Split a string
txt - string to split
sep - separator, one character
esc - escape character
escape_chars - List of characters allowed to be escaped
'''
l = []
tmp = []
i = 0
while i < len(txt):
if len(txt) > i + 1 and txt[i] == esc and txt[i+1] in escape_chars:
i += 1
tmp.append(txt[i])
elif txt[i] == sep:
l.append("".join(tmp))
tmp = []
elif txt[i] == esc:
print('Escape Error')
else:
tmp.append(txt[i])
i += 1
l.append("".join(tmp))
return l
if __name__ == "__main__":
txt = 'abc;vwx?;yz;123'
print split(txt, ';', '?', [';','\\','?'])
返回:
['abc', 'vwx;yz', '123']