Python正则表达式,查找并替换第二个制表符

时间:2017-03-01 19:33:16

标签: 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\tNULL\tNULL\tNULL\tNULL\r\n'

我已尝试使用和不使用r'',我也确认正则表达式适用于regex101.com

编辑:我已经将原始正则表达式替换为glibdud的优秀正版

3 个答案:

答案 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

使用拆分和加入

如果您需要其他索引,正则表达式可能会变得丑陋。您可以将splitjoin用于一般情况:

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