【发布时间】:2020-01-17 22:34:39
【问题描述】:
我有一个字段应该是用户输入的regex;但是有时用户会输入通配符。我想检查输入是否有通配符并拒绝。示例:
有效(仅包含正则表达式)
s = 'abc1.*r.*'
s = 'abc1.*r'
s = 'abc1.r'
无效(包含通配符)
s = 'abc1r'
s = 'abc1.*r*'
我已经尝试过 re.findall:
s = 'abc1.\*rr*.*' # String contains wildcard hence should be rejected
a = len(re.findall('\.\*', s))
b = len(re.findall('\*', s))
if a != b:
print "reject"
基本上检查 .* 和 * 的数量是否相等。如果不是,那意味着有一个 '*' 没有一个 '.'
有没有更好、更清洁的方法?
【问题讨论】:
-
但是
abc1*r*也是一个有效的正则表达式,不是吗? -
没错,这个问题的措辞可以更好。有一个函数可以将此正则表达式与用户的进一步输入相匹配。通常,'abc4*test' 应该匹配 'abc44test' 但这个函数不匹配它。这是一些我不太熟悉的 Java 东西,我无法更改此函数的工作方式。
-
所以你不是要拒绝非正则表达式,你只是想拒绝至少有一个
*在非点之后的字符串?跨度> -
是的,没错。
-
这个问题似乎不仅仅是措辞不当——只是不清楚你所说的有效正则表达式是什么意思。就像@sweeper 所说,
abc1*r*是一个完全有效的正则表达式,它只是意味着与abc1.*r.*完全不同的东西。它允许重复1和r零次或多次,而第二次需要至少一个1和r,但允许在其后进行任何操作。
标签: python regex string wildcard