我在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',"([.*]*,[.*]*)*",'
有不同的变化,但它不起作用。
感谢您的回答,问题解决了。
答案 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()
将所有逗号转为标志