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

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现在是正确的)。这

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

  • 问题内容: 假设我想要一个正则表达式,使其与“从iPhone发送”和“从iPod发送”都匹配。我该如何写这样的表达? 我尝试过类似的事情: 但似乎不起作用。 问题答案: