像'一样拆分字符串;foo=bar#baz=qo\#ox#al\=pha=beta使用regexp
这里有一个快速的挑战。 以这个字符串像'一样拆分字符串;foo=bar#baz=qo\#ox#al\=pha=beta使用regexp,regex,Regex,这里有一个快速的挑战。 以这个字符串foo=bar#baz=qo\#ox#al\=pha=beta为例,它由键-值对组成,键-值对之间用#分隔,键和值之间用“=”分隔,并使用正则表达式(perl、python、classic等)。如果在键或值中遇到字符#和=,则它们的前缀为\。 因此,结果应该是一个键/值表: KEY | VALUE foo | bar baz | qo#ox al=pha | beta 如果您的regexp(split或match)只在#字符处拆分它,您将
foo=bar#baz=qo\#ox#al\=pha=beta
为例,它由键-值对组成,键-值对之间用#分隔,键和值之间用“=”分隔,并使用正则表达式(perl、python、classic等)。如果在键或值中遇到字符#和=,则它们的前缀为\。
因此,结果应该是一个键/值表:
KEY | VALUE
foo | bar
baz | qo#ox
al=pha | beta
如果您的regexp(split或match)只在#字符处拆分它,您将获得100分。如果您能够一次性拆分=字符处的键和值,则可以额外获得50分
另外,使用令牌解析和向前或向后看来解决这个问题很简单,因此没有任何意义。这是一个两步过程:
import re
string = "foo=bar#baz=qo\#ox#al\=pha=beta"
regx = re.compile('(?:(?<=\A)|(?<=#))((?:[^=]|(?<=\\\\)=)+)=((?:[^#]|(?<=\\\\)#)+)')
print regx.findall(string)
编辑
毫无兴趣地回答:它不尊重措辞中表达的条件。表达式:
((?:\\\\.[^\\\=])+=((?:\\.[^\\\\\\\\\\\\]+)\\\\\\?”
可以通过应用弗里德尔的“展开循环”技术(如:([^\\\\\\\\\\\\\\\\]*(?:\\\\\.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]*)*)===([^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。否则答案很好+1@LHMathies我不懂perl,所以我不确定\\\
在中的含义是什么(?:\\\
及其在[^\\=]中的含义
。这是指字符“\'”
还是转义符号?顺便问一下,你的表情在看过之后非常明显,但这是一个棘手的问题。@ridgerunner很好地引用了Friedl,我不知道他展开循环的技巧,目前我不明白,我还没有研究过。还有很多东西需要学习正则表达式中的nme@ridgerunner我不想让事情变得更难理解……此外,它不是严格等价的,因为我在那里有+
,而不是*
(问题不是说是否允许空键或值)。此外,展开中嵌套的*
s让我毛骨悚然,很难记住,因为它的起点匹配独特,所以效率更高。@Konrads感谢这些要点!它们出现在哪里,或者我可以花在什么上?显然,这可以一步完成,@LHmathies已经证明:)
import re
string = "foo=bar#baz=qo\#ox#al\=pha=beta"
regx = re.compile('(?:(?<=\A)|(?<=#))((?:[^=]|(?<=\\\\)=)+)=((?:[^#]|(?<=\\\\)#)+)')
print regx.findall(string)
[('foo', 'bar'), ('baz', 'qo\\#ox'), ('al\\=pha', 'beta')]