【问题标题】:Python - How to check if a string has wildcards or regexPython - 如何检查字符串是否有通配符或正则表达式
【发布时间】: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.* 完全不同的东西。它允许重复 1r 零次或多次,而第二次需要至少一个 1r,但允许在其后进行任何操作。

标签: python regex string wildcard


【解决方案1】:

这可以用这个正则表达式来完成:

[^.]\*

此正则表达式查找非点字符后跟*。如果这在任何地方匹配,那么正则表达式应该被拒绝:

if re.search(r'[^.]\*', s):
    print("Rejected!")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2022-01-18
    相关资源
    最近更新 更多