所以可以说我有以下字符串:
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)
答案 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)