当前位置: 首页 > 面试题库 >

Python正则表达式是否等效于Ruby的原子分组?

梁巴英
2023-03-14
问题内容

Ruby的正则表达式具有一个称为“原子分组”的功能(?>regexp),在此进行了介绍,Python的re模块中是否有等效功能?


问题答案:

Python并不直接支持此功能,但是您可以使用零宽度前瞻断言((?=RE))进行仿真,该断言从当前点开始以您想要的相同语义进行匹配,将命名组((?P<name>RE))放入前瞻,然后使用命名后向引用((?P=name)),以完全匹配零宽度断言匹配的内容。结合在一起,这将为您提供相同的语义,但以创建其他匹配组和大量语法为代价。

例如,您提供的链接提供了Ruby的示例

/"(?>.*)"/.match('"Quote"') #=> nil

我们可以这样在Python中进行仿真:

re.search(r'"(?=(?P<tmp>.*))(?P=tmp)"', '"Quote"') # => None

我们可以证明我正在做有用的事情,而不仅仅是散发出线噪,因为如果我们更改它以使内部组不吃决赛",它仍然匹配:

re.search(r'"(?=(?P<tmp>[A-Za-z]*))(?P=tmp)"', '"Quote"').groupdict()
# => {'tmp': 'Quote'}

您还可以使用匿名组和数字后向引用,但是这样会充满行噪:

re.search(r'"(?=(.*))\1"', '"Quote"') # => None

(完整披露:我从perl的perlre文档中学到了这个技巧,该文档在的文档中进行了提及(?>...)。)

除了具有正确的语义外,这还具有适当的性能。如果我们将示例移植到perlre

[nelhage@anarchique:~/tmp]$ cat re.py
import re
import timeit


re_1 = re.compile(r'''\(
                           (
                             [^()]+           # x+
                           |
                             \( [^()]* \)
                           )+
                       \)
                   ''', re.X)
re_2 = re.compile(r'''\(
                           (
                             (?=(?P<tmp>[^()]+ ))(?P=tmp) # Emulate (?> x+)
                           |
                             \( [^()]* \)
                           )+
                       \)''', re.X)

print timeit.timeit("re_1.search('((()' + 'a' * 25)",
                    setup  = "from __main__ import re_1",
                    number = 10)

print timeit.timeit("re_2.search('((()' + 'a' * 25)",
                    setup  = "from __main__ import re_2",
                    number = 10)

我们看到了巨大的进步:

[nelhage@anarchique:~/tmp]$ python re.py
96.0800571442
7.41481781006e-05

随着我们扩展搜索字符串的长度,这只会变得更加引人注目。



 类似资料:
  • 主要内容:语法,实例,正则表达式修饰符,正则表达式模式,正则表达式实例,字符,字符类,特殊字符类,重复,非贪婪重复,通过圆括号进行分组,反向引用,替换,锚,圆括号的特殊语法,搜索和替换,实例,实例正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找字符串集合。 正则表达式用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。 语法 正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模

  • 问题内容: 我正在学习正则表达式,我想在Python中使用正则表达式仅定义整数-整数,而不定义小数。 我可以使用来制作一个仅允许数字使用的数字,但也可以使用十进制数字,这是我不想要的: 如何更改代码以 仅 允许整数? 问题答案: 正则表达式基于字符进行工作,表示单个数字…而不是十进制数字。 例如,仅匹配带符号整数的正则表达式可能是 含义 -字符串开始 -可选的(这是什么意思)减号或加号 -一个或多

  • 下面是我正在使用的正则表达式的最新版本,它抛出了错误“Invalid regular expression” XSD:正则表达式在位置4验证失败:当前选项设置不支持此表达式。 我在xsd文件中得到了这个异常,我正在message broker(IIB)中开发这个xsd。有谁能帮我解决这个问题吗?

  • 我知道有很多类似的问题,但我在任何地方都找不到我的案例。 我试图在Ruby on Rails用户模型中写一个全名正则表达式。它应该验证名字和姓氏是否填充了一个空格。这两个名字都应该包含至少两个字符(例如:马丽)。 作为一个奖励,但不是必须的,我想修剪空白到一个字符的情况下,用户将错误地输入一个以上的空白(例如:李 这对我有效,但是不检查每个名字的最少2个字符(例如:Peter P现在是正确的)。这

  • 我有一个带两个可能输出的字符串,它将被<代码>

  • 问题内容: 我只是想知道是否可以使用一个正则表达式来匹配另一个,这是某种形式的: 正则表达式完全可以实现这种功能吗?我正在使用python进行工作,因此有关该模块实现的任何建议都将有所帮助,但我将尽我所能获取有关正则表达式的信息。 编辑:好的,显然需要按顺序进行澄清!我绝对知道正常的匹配语法如下所示: 但是我想知道正则表达式是否能够匹配我在上面试图解释的非语法正确版本中的其他较不具体的表达式,bx