我需要转换的用户输入中有字符串。用例非常简单:
理论上,没有大问题。我使用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,那就太棒了......这是我可以向用户解释的东西。
这样做的最佳解决方案是什么?
感谢您的帮助,
答案 0 :(得分:1)
而不是字符串replace
方法使用re.sub()
和count=1
import re
re.sub(';;', ';', 'foo;;;bar', count=1)
答案 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']