我正在尝试使用正则表达式查找并替换字符串中的第二个制表符。
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的优秀正版
答案 0 :(得分:5)
你可能会过度思考它。
>>> 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'
只需匹配选项卡的第一个实例,然后匹配任意数量的非选项卡,后跟选项卡,并将其替换为除最终选项卡之外的所有内容以及您要替换它的任何内容。
答案 1 :(得分:0)
try:
import ujson as json
except ImportError:
import json
def parse_json(string):
if len(text) > 0:
text = text.strip()
if text != "" and ((text[0] == "{" and text[-1] == "}") or (text[0] == "[" and text[-1] == "]")):
try:
return json.loads(string)
except:
return string
您就在那里,在>>> re.sub(r'^((?:(?!\t).)*\t(?:(?!\t).)*)\t',r'\1###', booby)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'
\1
由于评论,我提供了另一种解决方法:
###
答案 2 :(得分:0)
这是我能找到的最短的正则表达式:
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
如果您需要其他索引,正则表达式可能会变得丑陋。您可以将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