删除字符串中的逗号,用逗号和双引号/ Python包围

时间:2013-08-14 15:28:42

标签: python regex

我在stackoverflow上发现了一些类似的主题,但我是Python和Reg Exps的新手。

我有一个字符串

  

,“2星级高级酒店宜必思柏林酒店于2009年全面翻新   Messe酒店拥有168间空调客房,毗邻   柏林的ICC和展览中心。所有房间都有无线网络连接,你可以   大堂的两台iPoint-PC免费上网。我们   提供24小时营业的酒吧,小吃和接待服务。享受我们的   自助早餐从早上4点到中午12点在8楼,你有一个   整个柏林的美景。您将直接找到免费停车场   在酒店旁边。“,

模式应该是:comma, double quote|any text with commas |double quote, comma。 我需要用双引号替换逗号,例如用@字符替换。 我应该使用哪种reg exp模式?

我试过了:

r',"([.*]*,[.*]*)*",' 

有不同的变化,但它不起作用。

感谢您的回答,问题解决了。

4 个答案:

答案 0 :(得分:2)

如果您需要做的就是用@字符替换逗号,您应该考虑使用str_replace而不是正则表达式。

str_a = "Completely renovated in 2009, the 2-star Superior Hotel Ibis Berlin Messe, with its 168 air-conditioned rooms, is located right next to Berlin's ICC and exhibition center. All rooms have Wi-Fi, and you can surf the Internet free of charge at two iPoint-PCs in the lobby. We provide a 24-hour bar, snacks and reception service. Enjoy our breakfast buffet from 4am to 12pm on the 8th floor, where you have a fantastic view across Berlin. You will find free car parking directly next to the hotel."

str_a = str_a.replace('","', '@') #commas inside double quotes
str_a = str_a.replace(',', '@') #replace just commas

print str_a

编辑:或者您可以列出要替换的内容,然后循环浏览并执行替换。例如:

to_replace = ['""', ',', '"']

str_a = "Completely renovated in 2009, the 2-star Superior Hotel Ibis Berlin Messe, with its 168 air-conditioned rooms, is located right next to Berlin's ICC and exhibition center. All rooms have Wi-Fi, and you can surf the Internet free of charge at two iPoint-PCs in the lobby. We provide a 24-hour bar, snacks and reception service. Enjoy our breakfast buffet from 4am to 12pm on the 8th floor, where you have a fantastic view across Berlin. You will find free car parking directly next to the hotel."

for a in to_replace:
    str_a = str_a.replace(a, '@')

print str_a

答案 1 :(得分:2)

嗯,你的正则表达式是可疑的。

,"([.*]*,[.*]*)*",

[.*]将匹配文字点或星号(.*成为字符类中的文字。)

此外,如果这实际上可以匹配字符串中的某些内容,那么您将只能替换一个逗号,因为字符串的其余部分(包括逗号)将由正则表达式使用并且一旦被使用,则无法再次替换,除非你运行一个循环,直到没有更多的逗号可以替换。

使用re.sub可以做什么并替换这些逗号是使用外观(你可以google它,我相信有足够的关于它们的文档)。如果您只有一对双引号,则可以确保仅替换逗号后跟一个双引号:

,(?=[^"]*"[^"]*$)

[^"]表示不是双引号的字符。 [^"]*表示这将重复0次或更多次。

$表示该行的结尾。

现在,前瞻(?= ... )确保逗号前面有什么内容。

请参阅与here匹配的逗号。

之后,您只需用您想要的任何值替换逗号即可。

str = re.sub(r',(?=[^"]*"[^"]*$)', '@', str)

但是,如果有多个双引号,则应确保前面有双引号的奇数。这可以通过使用正则表达式来完成:

,(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$)
顺便说一下,

(?: ... )是一个非捕获组。

答案 2 :(得分:2)

你可以试试这个(非常致命)。这里的诀窍是,一对双引号中的任何字符后面跟着奇数个双引号,当然假设你的双引号是平衡的:

s = 'some comma , outside "Some comma , inside" , "Completely , renovated in 2009",'

import re
s = re.sub(r',(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)', "@", s)
print s

<强>输出

some comma , outside "Some comma @ inside" , "Completely @ renovated in 2009",

答案 3 :(得分:2)

如果模式始终如上所述,则以下代码段将执行您想要的操作:

text = ',' + text[1:-2].replace(',', '@') + ','

讨论

  • text[1:-2]将为您提供原始字符串,减去第一个和最后一个字符(逗号)
  • 然后我们致电.replace()将所有逗号转为标志
  • 最后,我们放回第一个和最后一个逗号以形成结果字符串