两个表达式之间的正则表达式替换

时间:2020-04-19 22:27:51

标签: python regex

所以可以说我有以下字符串:

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,出于某种原因(很难看,没有发现任何原因),有时(显然是随机地)在这些类型的字符串中的数字之间插入逗号。

所以我要完成的工作就是通过正则表达式检测这些逗号,然后将它们替换为空(删除逗号)。

对第一种类型的字符串说,即:'187-14,412',我一直在尝试:

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

在此示例中,逗号为组1,但如何在此正则表达式中指定sub(1)?

我也一直在尝试向后看和向后看,但在向后看时遇到了麻烦:

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

我想知道是否有更好的方法来对这些字符串进行正则表达式,或者能够在re.sub上指定group(1)

4 个答案:

答案 0 :(得分:2)

解决方案

您可以将简单的pythonic list-comprehension 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,则可以选择这种方式。

import re # regex library
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()如下提取带有单点和双点划线的数字。

import re # regex library

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 :(得分:1)

您不需要正则表达式,只需在','处分割字符串即可。并且,如果产生的数组长度大于1,则切掉左字符串的最后一个索引(索引为0)和右第一个索引(索引为1)。 哦,idk,您可能确实需要它。

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

这是在JavaScript中完成的,但与Python匹配\d,一样容易,并且不进行任何替换。十分简单, 我不太了解Python,但是很可能会做到

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您可以使用lambda expression in re.sub

来使用正则表达式

更改

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

收件人:

re.sub(r'\d+\-\d+(\,)\d+', lambda m: m.group(0).replace(',', ''), stringX)