Skip to content Skip to sidebar Skip to footer

Python Regex, Find And Replace Second Tab Character

I am trying to find and replace the second tab character in a string using regex. booby = 'Joe Bloggs\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n' This works fine: re.sub(

Solution 1:

You may be overthinking it a little.

>>>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'

Simply match the first instance of a tab followed by any number of non-tabs followed by a tab, and replace it with everything but the final tab and whatever you want to replace it with.

Solution 2:

>>> re.sub(r'^((?:(?!\t).)*\t(?:(?!\t).)*)\t',r'\1###', booby)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'

You are almost there, add \1 before ###

I provide another way to solve it because of the comments:

>>> booby.replace("\t", "###",2).replace("###", "\t",1)
'Joe Bloggs\tNULL###NULL\tNULL\tNULL\tNULL\tNULL\tNULL\tNULL\r\n'

Solution 3:

With regex

This is the shortest regex I could find :

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)

It uses non-greedy . to make sure it doesn't glob too many tabs. It outputs :

Joe Bloggs  NULL###NULLNULLNULLNULLNULLNULLNULL

With split and join

The regex might get ugly if you need it for other indices. You could use split and join for the general case :

n = 2
sep = '\t'
cells = booby.split(sep)
print sep.join(cells[:n]) + "###" + sep.join(cells[n:])

It outputs :

Joe Bloggs  NULL###NULLNULLNULLNULLNULLNULLNULL

Post a Comment for "Python Regex, Find And Replace Second Tab Character"