如何从字符串中的双引号之间删除\ n founds?

时间:2011-07-19 20:41:18

标签: python string

美好的一天,

我是Python新手,我正在尝试使用字符串。

我想从给定字符串中删除双引号(\n 之间找到的所有"个字符:

str = "foo,bar,\n\"hihi\",\"hi\nhi\""

所需的输出必须是:

foo,bar
"hihi", "hihi"

修改

所需的输出必须与该字符串类似: after = "foo,bar,\n\"hihi\",\"hihi\""

任何提示?

6 个答案:

答案 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"'
>>>

简短说明:

  1. re.sub是一个替代引擎。它需要正则表达式,替换函数或表达式,要处理的字符串以及其他选项。
  2. 正则表达式“。*?”捕获双引号中的字符串,这些字符串本身不包含其他双引号(它有一个小错误,因为它不会捕获包含转义双引号的字符串)。
  3. lambda x:...是一个表达式,可以在任何可以使用函数的地方使用。
  4. 替换引擎使用匹配对象调用函数。 x.group(0)是“整个匹配的字符串”,它还包括双引号。 x.group(0)是匹配的字符串,'\ n'代替''。
  5. 标志re.S告诉re.sub'\ n'是一个用点捕获的有效字符。
  6. 就我个人而言,我发现更长的功能说同样的东西更累,更不易读,就像在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"'