处理字符串中的转义字符

时间:2016-11-18 17:44:18

标签: python regex escaping

我需要转换的用户输入中有字符串。用例非常简单:

  • 当字符串中有分号时,字符串会分成多行。
  • 当连续有两个分号时,它们会转换为一个分号。

理论上,没有大问题。我使用Python,但我确信使用其他语言的其他人会发现使用正则表达式很容易。

import re

def get_lines(text):
    """Return a list of lines (list of str)."""
    command_stacking = ";"
    delimiter = re.escape(command_stacking)
    re_del = re.compile("(?<!{s}){s}(?!{s})".format(s=delimiter), re.UNICODE)
    chunks = re_del.split(text)

    # Clean the double delimiters
    for i, chunk in enumerate(chunks):
        chunks[i] = chunk.replace(2 * command_stacking, command_stacking)

    return chunks

这似乎有效:

>>> get_lines("first line;second line;third line with;;a semicolon")
['first line', 'second line', 'third line with;a semicolon']
>>>

但是当有三个或四个分号时,它的行为并不像预期的那样。

正则表达式会忽略多个分号(正如它们所应),但在;;替换;时,;;;将替换为;;,{{1 }被;;;;替换,依此类推。如果2被1,3替换为2,4乘3,那就太棒了......这是我可以向用户解释的东西。

这样做的最佳解决方案是什么?

感谢您的帮助,

3 个答案:

答案 0 :(得分:1)

而不是字符串replace方法使用re.sub()count=1

import re
re.sub(';;', ';', 'foo;;;bar', count=1)

https://docs.python.org/2/library/re.html#re.sub

答案 1 :(得分:1)

re.sub的repl参数可以是一个函数。

{{1}}

答案 2 :(得分:0)

您可以使用re.split环顾四周。

示例

>>> re.split(r'(?<!;);(?!;)', string)
['first line', 'second line', 'third line with;;a semicolon']

<强>正则表达式

  • (?<!;)背后的负面看法。检查;之前是否有另一个;
    • ;匹配;
  • (?!;)负面展望未来。检查;是否未跟随其他;
>>> [x.replace(';;', ';') for x in re.split(r'(?<!;);(?!;)', string)]
['first line', 'second line', 'third line with;a semicolon']