7

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

我有一个字符串

”2 星级宜必思柏林展览中心酒店于 2009 年全面装修,拥有 168 间空调客房,毗邻柏林的 ICC 和展览中心。所有客房均提供无线网络连接,您可以免费上网在大堂的两台 iPoint-PC 上收费。我们提供 24 小时酒吧、小吃和接待服务。早上 4 点至中午 12 点在 8 楼享用我们的自助早餐,您可以在这里欣赏柏林的美景。您将免费享用停车场就在酒店旁边。",

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

我试过这个:

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

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

谢谢各位的解答,问题解决了。

4

4 回答 4

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
于 2013-08-14T15:32:30.633 回答
2

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

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

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

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

您可以使用re.sub和替换这些逗号的方法是使用环视(您可以谷歌搜索,我相信有足够的关于它们的文档)。如果您只有一对双引号,则可以确保只替换逗号后跟一个双引号:

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

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

$是指行的结束。

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

请参阅此处匹配的逗号。

之后,您可以简单地将逗号替换为您想要的任何值。

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

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

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

(?: ... )顺便说一句是非捕获组。

于 2013-08-14T15:41:21.097 回答
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",
于 2013-08-14T15:41:46.447 回答
2

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

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

讨论

  • text[1:-2]会给你原始字符串,减去第一个和最后一个字符(逗号)
  • 然后我们调用.replace()将所有逗号转换为 at 符号
  • 最后,我们放回第一个和最后一个逗号以形成结果字符串
于 2013-08-14T15:52:02.027 回答