正则表达式在python中删除数字前的逗号

正则表达式在python中删除数字前的逗号,python,regex,data-cleaning,Python,Regex,Data Cleaning,我正在处理一个使用逗号作为分隔符的文件。但是,它有一个字段,地址在其中,地址的形式是x,y,z,这会导致一个问题,因为地址的每个部分都有一个新的列条目。地址后面紧跟着一个1位数的成员号,如2等。 Col1(地址),Col2(1位数字) 我基本上希望从地址字段中删除该数字之前的所有逗号 输出应该是 52A XYZ Street ABC District, 2' 我试过了 re.sub(r',', ' ', text) 但它正在替换所有逗号实例。使用零宽度负前瞻,以确保要替换的子字符串(此处为逗

我正在处理一个使用逗号作为分隔符的文件。但是,它有一个字段,地址在其中,地址的形式是x,y,z,这会导致一个问题,因为地址的每个部分都有一个新的列条目。地址后面紧跟着一个1位数的成员号,如2等。 Col1(地址),Col2(1位数字)

我基本上希望从地址字段中删除该数字之前的所有逗号

输出应该是

52A XYZ Street ABC District, 2'
我试过了

re.sub(r',', ' ', text)

但它正在替换所有逗号实例。

使用零宽度负前瞻,以确保要替换的子字符串(此处为逗号)后面没有结尾处的
{space(s)}{digit}

,(?!\s+\d$)
示例:

In [227]: text = '52A, XYZ Street, ABC District, 2'

In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'

In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'

In [231]: text = '52A, XYZ Street, ABC District, 2'

In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'

编辑:

In [227]: text = '52A, XYZ Street, ABC District, 2'

In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'

In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'

In [231]: text = '52A, XYZ Street, ABC District, 2'

In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'
如果在
,{space(s)}{digit}
子字符串之后有更多的逗号,并且希望保留它们,请利用负查找确保逗号前面没有
{space}{digit[a-Z]}

(?<!\s[\dA-Z]),(?!\s+\d,?)
(?
示例:

In [227]: text = '52A, XYZ Street, ABC District, 2'

In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'

In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'

In [231]: text = '52A, XYZ Street, ABC District, 2'

In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'
In[229]:text='52A,ABC区XYZ街,2米,布朗'

在[230]:re.sub('(?使用零宽度负前瞻,以确保要替换的子字符串(此处的逗号)后面没有结尾处的
{space(s)}{digit}

,(?!\s+\d$)
示例:

In [227]: text = '52A, XYZ Street, ABC District, 2'

In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'

In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'

In [231]: text = '52A, XYZ Street, ABC District, 2'

In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'

编辑:

In [227]: text = '52A, XYZ Street, ABC District, 2'

In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'

In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'

In [231]: text = '52A, XYZ Street, ABC District, 2'

In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'
如果在
,{space(s)}{digit}
子字符串之后有更多的逗号,并且希望保留它们,请利用负查找确保逗号前面没有
{space}{digit[a-Z]}

(?<!\s[\dA-Z]),(?!\s+\d,?)
(?
示例:

In [227]: text = '52A, XYZ Street, ABC District, 2'

In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'

In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'

In [231]: text = '52A, XYZ Street, ABC District, 2'

In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'
In[229]:text='52A,ABC区XYZ街,2米,布朗'

在[230]中:re.sub(')(?如果末尾仅为一个数字,则可以使用此选项。如果最后一个逗号后是多个数字,则可以进行调整(数字3应递增)

输出是

52A XYZ Street ABC District, 2

如果结尾仅为一个数字,则可以使用此选项。如果最后一个逗号后为多个数字(数字3应递增),则可以进行调整

输出是

52A XYZ Street ABC District, 2

不需要正则表达式。您只需查找上次出现的
,然后使用它,如中所示:

text[:text.rfind(',')].replace(',', '') + text[text.rfind(','):]

不需要正则表达式。您只需查找上次出现的
,然后使用它,如中所示:

text[:text.rfind(',')].replace(',', '') + text[text.rfind(','):]


不是100%确定正则表达式是正确的方法,除非您可以确定没有街道名称以数字开头(例如,第五大道)。地址的所有部分都附加到像52A这样的字母表上。地址空间中没有独立的数字。您想说您只想删除第一个“独立”数字之前的逗号吗?例如
re.sub(r'^(.*)(,\s*\d+\b)”,lambda x:“{}{}”.format(x.group(1).替换(',',''),x.group(2)),s)
?是的,完全是@WiktorStribiżewt,听起来像个谜。尽量不要100%确定正则表达式是正确的选择,除非你能确定没有街道名称以数字开头(例如第五大道)。地址的所有部分都附加到像52A这样的字母表上。地址空间中没有独立的数字。您想说您只想删除第一个“独立”数字之前的逗号吗?例如
re.sub(r'^(.*)(,\s*\d+\b),lambda x:“{}{}”。格式(x.group(1)。替换(',''),x.group(2)),s)
?没错@WiktorStribiżewt听起来像个谜语。如果我在数字后面还有其他东西,试试看。比如说text='52A,XYZ Street,ABC District,2,M,Brown'?谢谢你的回答。@RohitGirdhar你希望从中得到什么?它的形式应该是:52A XYZ Street ABC District,2,M,Brown,逗号保持不变输入一位数字,但在数字接受你的答案之前被删除。WiktorStribiżew也有一个很好的方法。如果我在数字后面还有其他东西呢。比如说text='52A,XYZ Street,ABC District,2,M,Brown'?感谢你的回答。@RohitGirdhar你希望从中得到什么?它的形式应该是:52A XYZ街道ABC区,2,M,棕色,在一位数之后逗号保持不变,但在数字接受你的答案之前被删除。WiktorStribiżew也有一个很好的方法。