美好的一天,
我是Python新手,我正在尝试使用字符串。
我想从给定字符串中删除双引号(\n
) 之间找到的所有"
个字符:
str = "foo,bar,\n\"hihi\",\"hi\nhi\""
所需的输出必须是:
foo,bar
"hihi", "hihi"
修改
所需的输出必须与该字符串类似:
after = "foo,bar,\n\"hihi\",\"hihi\""
任何提示?
答案 0 :(得分:3)
这应该做:
def removenewlines(s):
inquotes = False
result = []
for chunk in s.split("\""):
if inquotes: chunk.replace("\n", "")
result.append(chunk)
inquotes = not inquotes
return "\"".join(result)
答案 1 :(得分:3)
一个简单的有状态过滤器可以解决问题。
in_string = False
input_str = 'foo,bar,\n"hihi","hi\nhi"'
output_str = ''
for ch in input_str:
if ch == '"': in_string = not in_string
if ch == '\n' and in_string: continue
output_str += ch
print output_str
答案 2 :(得分:2)
>>> str = "foo,bar,\n\"hihi\",\"hi\nhi\""
>>> re.sub(r'".*?"', lambda x: x.group(0).replace('\n',''), str, flags=re.S)
'foo,bar,\n"hihi","hihi"'
>>>
简短说明:
就我个人而言,我发现更长的功能说同样的东西更累,更不易读,就像在C中我希望i++
到i = i + 1
一样。这完全取决于人们习惯阅读的内容。
答案 3 :(得分:2)
快速注意:Python字符串可以使用''
或""
作为分隔符,因此,为了便于阅读,通常的做法是在另一个字符串内部使用时。例如:'foo,bar,\n"hihi","hi\nhi"'
。关于这个问题......
你可能想要python regexp模块:re。
特别是,替换功能就是你想要的。有很多方法可以做到这一点,但一个快速的选择是使用标识""
子串的正则表达式,然后调用辅助函数来剥离它们中的任何\n
......
import re
def helper(match):
return match.group().replace("\n","")
input = 'foo,bar,\n"hihi","hi\nhi"'
result = re.sub('(".*?")', helper, input, flags=re.S)
答案 4 :(得分:1)
此正则表达式有效(假设引号已正确平衡):
import re
result = re.sub(r"""(?x) # verbose regex
\n # Match a newline
(?! # only if it is not followed by
(?:
[^"]*" # an even number of quotes
[^"]*" # (and any other non-quote characters)
)* # (yes, zero counts, too)
[^"]*
\z # until the end of the string.
)""",
"", str)
答案 5 :(得分:0)
像这样的东西
将CSV数据分成几列。
>>> m=re.findall(r'(".*?"|[^"]*?)(,\s*|\Z)',s,re.M|re.S)
>>> m
[('foo', ','), ('bar', ',\n'), ('"hihi"', ','), ('"hi\nhi"', ''), ('', '')]
仅将'\ n'的字段实例替换为''。
>>> [ field.replace('\n','') + sep for field,sep in m ]
['foo,', 'bar,\n', '"hihi",', '"hihi"', '']
重新组合生成的东西(如果真的那么重要。)
>>> "".join(_)
'foo,bar,\n"hihi","hihi"'