【问题标题】:How to distinguish a regex and a non regex string in python3 [closed]如何区分python3中的正则表达式和非正则表达式字符串[关闭]
【发布时间】:2018-03-05 20:44:17
【问题描述】:

看下面两个例子:

https://stackoverflow.com

(https|http):\/\/.*

第一个是普通 URL,第二个是 REGEX 字符串。 python3中如何区分哪个是正则表达式字符串,哪个不是?

【问题讨论】:

  • 两者都可以是正则表达式字符串。这取决于上下文。只有在您向我们展示了您在何处以及如何使用该字符串后,我们才能告诉您它是否是正则表达式。
  • 第一个也可以是正则表达式。
  • 第一个是匹配 https://stackoverflow 后跟任意字符后跟 com 的正则表达式。
  • @Barmar,确实如此。它验证为正则表达式,但如何以某种方式区分这两个?这是一个困难的
  • 虽然更复杂,但您可以使用使用sklearn 的机器学习分类器并在与此类似的数据集上进行训练:github.com/nicholaslocascio/deep-regex/blob/master/datasets/… 以便能够识别来自非正则表达式的基本正则表达式字符串。

标签: python regex python-3.x


【解决方案1】:

这两个字符串都可能是有效的正则表达式字符串 - 并且都可以在 python 中工作。您唯一能做的就是找到明确是 not 有效正则表达式的字符串:

re.compile('https://stackoverflow.com')
# re.compile('https://stackoverflow.com')

re.compile('(https|http):\/\/.*')
# re.compile('(https|http):\\/\\/.*')

re.compile('(?:http|?:https)')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/re.py", line 224, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python3.5/re.py", line 293, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.5/sre_compile.py", line 536, in compile
    p = sre_parse.parse(p, flags)
  File "/usr/lib/python3.5/sre_parse.py", line 829, in parse
    p = _parse_sub(source, pattern, 0)
  File "/usr/lib/python3.5/sre_parse.py", line 437, in _parse_sub
    itemsappend(_parse(source, state))
  File "/usr/lib/python3.5/sre_parse.py", line 778, in _parse
    p = _parse_sub(source, state)
  File "/usr/lib/python3.5/sre_parse.py", line 437, in _parse_sub
    itemsappend(_parse(source, state))
  File "/usr/lib/python3.5/sre_parse.py", line 638, in _parse
    source.tell() - here + len(this))
sre_constants.error: nothing to repeat at position 8

【讨论】:

  • 是的 - 我一粘贴就注意到了!已使用实际无效的正则表达式进行更新。
【解决方案2】:

两者都是字符串,都可以编译为正则表达式——这取决于你如何使用它们。

以下将进行逐字符串比较:

>>> x = "https://stackoverflow.com"
>>> if x == "https://stackoverflow.com":
...   print("true")
...
true

以下将进行正则表达式比较:

>>> import re
>>> x = "https://stackoverflow.com"                                           
>>> if re.match("(https|http):\/\/.*", x):
...   print("true")
...
true

【讨论】:

    【解决方案3】:

    您对合法问题使用了错误的示例。正则表达式和非正则表达式可能有共同的字母表,但它们的规则不同。如果一个字符串遵循正则表达式规则,那么它也是一个正则表达式字符串。

    超越@match 答案,您可以测试它是否是带有 try/except 子句的有效正则表达式:

    try:
        re.compile("MYNOTYETREGEXSTRING")
        print("It's regexp!")
    except:
        print("It doesn't belong to the regexp grammar")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2015-04-27
      • 2021-10-01
      相关资源
      最近更新 更多