Подстановка регулярных выражений между двумя выражениями - PullRequest
0 голосов
/ 20 апреля 2020

Допустим, у меня есть следующие строки:

stringX = ['187-49481,14',
'181-457216',
'196,61-04-22',
'1972-10-28',
'19,940-04-16',
'2017-08,8-29',
'2014-04-18']

Обратите внимание, что у меня есть два типа строк: тип 181-457216 и тип 1972-10-28 (дата), которые я изменяю CSV, и по какой-то причине (внимательно посмотрел, не нашел никакой причины), иногда - по-видимому, случайно - вставляет запятую между числами в этих типах строк.

Так что я хочу сделать sh состоит в том, чтобы просто обнаружить эти запятые с помощью регулярного выражения и заменить их пустыми (убрать запятые).

Скажите для первого типа строки, то есть: «187-14,412», который я пытался:

re.sub(r'\d+\-\d+(\,)\d+', '', stringX)

В этом примере запятая - это группа 1, но как я могу указать подгруппу (1) в этом регулярном выражении?

Я также пробовал смотреть назад и смотреть вперед, но у меня возникли проблемы с внешним видом:

(?<=\d+\-\d+)(\,)(?=\d+)
Err: lookbehind assertion is not fixed length at offset 0

Я бродил, если есть лучший способ для регулярного выражения этих строк, или чтобы иметь возможность указать группу (1) для re.sub

Ответы [ 4 ]

2 голосов
/ 20 апреля 2020

Вы можете использовать простой pythoni c список-понимание с str.replace().

[x.replace(',','') for x in stringX]

Выход :

['187-4948114',
 '181-457216',
 '19661-04-22',
 '1972-10-28',
 '19940-04-16',
 '2017-088-29',
 '2014-04-18']

Если вы хотите использовать regex, то это может быть альтернативой.

re.sub(',','', '|'.join(stringX)).split('|')

Вывод :

['187-4948114',
 '181-457216',
 '19661-04-22',
 '1972-10-28',
 '19940-04-16',
 '2017-088-29',
 '2014-04-18']

Извлечение значений с одним штрихом и с двумя пунктами

Вы можете извлечь числа с одинарным и двойным штрихи следующим образом с использованием re.findall().

text = [x.replace(',','') for x in stringX]
text = '\n'.join(text)
single_dash = re.findall('\d+-\d+', text)
double_dash = re.findall('\d+-\d+-\d+', text)
print(f'single dash: \n\n{single_dash}\n')
print(f'double dash: \n\n{double_dash}\n')

Выход :

single dash: 

['187-4948114', '181-457216', '19661-04', '1972-10', '19940-04', '2017-088', '2014-04']

double dash: 

['19661-04-22', '1972-10-28', '19940-04-16', '2017-088-29', '2014-04-18']
1 голос
/ 20 апреля 2020

Вы можете использовать свой метод регулярных выражений, используя лямбда-выражение в re.sub

Изменить

re.sub(r'\d+\-\d+(\,)\d+', '', stringX)

На:

re.sub(r'\d+\-\d+(\,)\d+', lambda m: m.group(0).replace(',', ''), stringX)
1 голос
/ 20 апреля 2020
import re
[re.sub(r'\,', '', x) for x in stringX]

['187-4948114', '181-457216', '19661-04-22', '1972-10-28', '19940-04-16', '2017-088-29', '2014-04-18']
1 голос
/ 20 апреля 2020

Вам не нужно регулярное выражение для этого, вы можете просто разбить строку на ','. И если он выдает массив длиной более 1, прервите последний индекс левой строки (с индексом 0) и первого справа (с индексом 1). О, может быть, вам это нужно, idk.

const p = '187-49481,14';
const regex = /\d,/;
console.log(p.replace(regex, ''));//result is 187-494814

Это сделано в JavaScript, но должно быть так же просто с Python match \d, и заменить его ничем. Легко, peasy, я не знаю Python это хорошо, но это, вероятно, сделало бы это

re.sub(r'\d,', '', stringX)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...