Python正则表达式,查找并替换第二个制表符
我正在尝试使用正则表达式查找并替换字符串中的第二个制表符Python正则表达式,查找并替换第二个制表符,python,regex,Python,Regex,我正在尝试使用正则表达式查找并替换字符串中的第二个制表符 booby = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n' 这很好: re.sub(r'\t',r'###', booby) 此用于查找第二个制表符的正则表达式无法按预期工作: re.sub(r'(\t[^\t]*)\t',r'###', booby) 我没有匹配并替换第二个选项卡,而是返回以下内容: '###NULL\tNULL\tNULL\tN
booby = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
这很好:
re.sub(r'\t',r'###', booby)
此用于查找第二个制表符的正则表达式无法按预期工作:
re.sub(r'(\t[^\t]*)\t',r'###', booby)
我没有匹配并替换第二个选项卡,而是返回以下内容:
'###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
我已经尝试过使用和不使用前缀r'',并且我已经确认正则表达式在regex101.com上有效
编辑:我已将原来的正则表达式替换为glibdud的高级正则表达式您可能想得有点过头了
>>> text = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
>>> re.sub(r'(\t[^\t]*)\t', r'\1###', text, count=1)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
只需将一个选项卡的第一个实例与任意数量的非选项卡和一个选项卡进行匹配,然后将其替换为除最后一个选项卡之外的所有选项卡和任何您想替换的选项卡。您可能有点想得太多了
>>> text = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
>>> re.sub(r'(\t[^\t]*)\t', r'\1###', text, count=1)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
>>> re.sub(r'^((?:(?!\t).)*\t(?:(?!\t).)*)\t',r'\1###', booby)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
只需将一个选项卡的第一个实例与任意数量的非选项卡和一个选项卡进行匹配,然后将其替换为除最后一个选项卡之外的所有内容以及您希望替换它的任何内容
>>> re.sub(r'^((?:(?!\t).)*\t(?:(?!\t).)*)\t',r'\1###', booby)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
就快到了,在###
之前添加\1
我提供了另一种解决方法,因为有这样的评论:
>>> booby.replace("\t", "###",2).replace("###", "\t",1)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
就快到了,在###
之前添加\1
我提供了另一种解决方法,因为有这样的评论:
>>> booby.replace("\t", "###",2).replace("###", "\t",1)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
用正则表达式
这是我能找到的最短的正则表达式:
import re
booby = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
print re.sub(r'(\t.*?)\t', r'\1###', booby, 1)
它使用非贪婪的
来确保它不会全局显示太多的选项卡。
它输出:
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
分节
如果其他索引需要正则表达式,它可能会变得丑陋。对于一般情况,您可以使用split
和join
:
n = 2
sep = '\t'
cells = booby.split(sep)
print sep.join(cells[:n]) + "###" + sep.join(cells[n:])
它输出:
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
用正则表达式
这是我能找到的最短的正则表达式:
import re
booby = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
print re.sub(r'(\t.*?)\t', r'\1###', booby, 1)
它使用非贪婪的
来确保它不会全局显示太多的选项卡。
它输出:
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
分节
如果其他索引需要正则表达式,它可能会变得丑陋。对于一般情况,您可以使用split
和join
:
n = 2
sep = '\t'
cells = booby.split(sep)
print sep.join(cells[:n]) + "###" + sep.join(cells[n:])
它输出:
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
Joe Bloggs NULL###NULL NULL NULL NULL NULL NULL NULL
我看不透我模糊的眼睛,谢谢@schnimmy:这个答案显示了使用经过调整的贪婪标记(否定单个字符)而不是正确的构造否定字符类的错误做法。我建议接受一个比这个更优雅的答案。@WiktorStribiżew有更多优雅的正则表达式,但这个答案专门解决了我的问题,为什么一个有效(但不是非常优雅)的正则表达式不是working@schnimmy:实际上,“优雅”与否并不重要。这只是一个非常糟糕的做法的例子。与使用
a(.\n)*?b
而不是(?s)a.*b
相同。不应该发布,必须删除。@downvoter,我认为我的主要责任是修改OP的代码,并使其按预期工作。我觉得我不该在这里投反对票,我看不透我那模糊的眼睛,谢谢@schnimmy:这个答案显示了使用经过调整的贪婪标记(否定单个字符)而不是正确的构造否定字符类的错误做法。我建议接受一个比这个更优雅的答案。@WiktorStribiżew有更多优雅的正则表达式,但这个答案专门解决了我的问题,为什么一个有效(但不是非常优雅)的正则表达式不是working@schnimmy:实际上,“优雅”与否并不重要。这只是一个非常糟糕的做法的例子。与使用a(.\n)*?b
而不是(?s)a.*b
相同。不应该发布,必须删除。@downvoter,我认为我的主要责任是修改OP的代码,并使其按预期工作。我认为我不应该在这里投下否决票