Заменить последний экземпляр символа в строке с помощью регулярного выражения - PullRequest
2 голосов
/ 22 января 2010

У меня есть CSV-файл с данными, подобными этим

Zoos, Sanctuaries & Animal Parks,7469,3.00

К сожалению, это не правильно, поскольку в первом разделе должно быть все одно поле, подобное этому

"Zoos, Sanctuaries & Animal Parks","7469","3.00"

Поскольку это только один раз импорт, я был бы рад преобразовать его в

Zoos, Sanctuaries & Animal Parks|7469|3.00

с последней и второй последней запятой, преобразованной в трубы. Есть ли простой способ сделать это с помощью регулярных выражений?

Ответы [ 5 ]

2 голосов
/ 22 января 2010

Чтобы преобразовать запятую в трубу последние 2 элемента, вы можете сделать это

>>> re.sub(",(\d+),([\d.]+)$","|\\1|\\2","Zoos, Sanctuaries & Animal Parks,7469,3.00")
'Zoos, Sanctuaries & Animal Parks|7469|3.00'
1 голос
/ 22 января 2010
$ cat test.csv 
Zoos, Sanctuaries & Animal Parks,7469,3.00
a,100,2000
a,b and c, 100,300

$ cat test.csv | perl -npe 's/^(.*),(.*),(.*)$/$1|$2|$3/'
Zoos, Sanctuaries & Animal Parks|7469|3.00
a|100|2000
a,b and c| 100|300
1 голос
/ 22 января 2010

Вы можете преобразовать в трубы таким образом. Просто введите текст с помощью этой команды:

sed 's/,\([^,]*\),\([^,]*\)$/|\1|\2/'
1 голос
/ 22 января 2010

Примерно так должно работать:

s/(\S),(\S)/\1|\2/g

(Заменяет все запятые, которые с обеих сторон окружены непробельными символами с трубками.)

0 голосов
/ 22 января 2010

Чтобы преобразовать последние запятые в трубы:

Заменить ^(.*?),([^,]*?),([^,]*?)$ на $1|$2|$3

Или даже лучше - преобразовать их в правильный формат:

Заменить ^(.*?),([^,]*?),([^,]*?)$ на "$1","$2","$3"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...