Пробел в строке CSV с использованием регулярных выражений - PullRequest
1 голос
/ 20 сентября 2019

В Python я пытаюсь поместить числа в пробел в строку CSV с помощью регулярных выражений.Конечно, я могу сделать это с помощью split (), format () и join (), но мое ограничение заключается в использовании регулярных выражений.Почему следующие re.sub делают замены только на найденные совпадения 0,2,4,6,8?Он пропускает все остальные совпадения.

import re

# trying to pad the single-digit numbers in a CSV with a single leading space
# input '1,2,12,14' would produce output ' 1, 2,12,14' (notice leading spaces on single-digit numbers)

s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35'
print(s)

# first, add commas to front and end so that first and final numbers are captured by the regex
s = ',' + s + ',' 
# the main regex
s = re.sub(r',([0-9]{1}),', r', \1,', s)
# lastly, strip the front and end commas we added before the regex
s = s.strip(',')
print(s)

... выше приводит к выводу следующей строки с входной строкой и выходной строкой:

0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35
 0,1, 2,3, 4,5, 6,7, 8,9,28,29,30,31,32,33,34,35

Так что мне просто любопытно, по какой технической причине, какre.sub() ведет себя здесь.

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Вы получите этот результат, потому что шаблон ,([0-9]), соответствует запятой, одной цифре, запятой.В этой строке (где вы также добавили запятую) ,0,1,2,3,4,5,6,7,8, может соответствовать только ,0,, а затем ,2, и т. Д.

Для заполнения однозначных чисел одним пробелом,Вы могли бы упростить свой сценарий, исключив использование полосы и добавляя запятые и используя вместо этого положительный взгляд на шаблон.

Обратите внимание, что использование квантификатора {1} можно опустить.

,([0-9])(?=,)

Regex demo | Python demo

Например

import re
s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35'
regex = r',([0-9])(?=,)'
s = re.sub(regex, r', \1', s)
print(s)

Выход

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,28,29,30,31,32,33,34,35

Если вы также хотите поддерживать заполнение только одной цифрой, вы можете обновитьположительное ожидание в конце соответствует либо запятой, либо утверждению конца строки:

,([0-9])(?=,|$)

Regex demo

Edit

Поскольку вы также хотите добавить и добавить запятую и дополнить первые цифры, вы можете обновить шаблон до (?:,|^)([0-9])(?=,|$)

import re

s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35'
s = ',' + s + ','
s = re.sub(r'(?:,|^)([0-9])(?=,|$)', r', \1', s)
s = s.strip(',')
print(s)

Output

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,28,29,30,31,32,33,34,35

Демо Python

0 голосов
/ 20 сентября 2019

Это то, где я закончил, включив регулярное выражение The fourth bird:

s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35,7'
print(s)
s = ',' + s + ',' 
regex = r',([0-9])(?=,|$)'
s = re.sub(regex, r', \1', s)
s = s.strip(',')
print(s)

..., которое при желании дает входную строку и строку вывода ниже:

0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35,7
 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,28,29,30,31,32,33,34,35, 7

Это работает для меня ... спасибо всем repsonders!

0 голосов
/ 20 сентября 2019

Я полагаю, что вы можете использовать следующее регулярное выражение, чтобы получить то, что вы хотите сделать:

r'(?<!\d)(\d)(?=,|$)'

Отрицательный взгляд позади, а не цифра: (?<!\d)

Соответствующая группа любая цифра: (\d)

Позитивный взгляд вперед через запятую или конец строки: (?=,|$)

https://regex101.com/r/UQtqHK/1

import re

s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,5'

print(s)

s = re.sub(r'(?<!\d)(\d)(?=,|$)', r' \1', s)
print(s)

При этом указано, что вы можете бытьлучше использовать str.format()

https://docs.python.org/3.7/library/string.html#format-string-syntax

row_one = "1,2,3,4,5,6,7,8,9,10,11,12,13"
row_two = "1,2,3,4,9,10,11,12,13,5,6,7,8"
row_one_array = row_one.split(',')
row_two_array = row_two.split(',')
print(",".join(["{:>2}".format(x) for x in row_one_array]))
print(",".join(["{:>2}".format(x) for x in row_two_array]))

Волшебный бит: {:>2}

: = начальный термин (не уверен, что это такоеназывается)

> = выравнивание по правому краю

2 = ширина символа

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