gpt4 book ai didi

python - 如何使用 (?(DEFINE)) 在 Python 中编写正则表达式?

转载 作者:太空狗 更新时间:2023-10-30 02:19:35 28 4
gpt4 key购买 nike

我想解析codetags在源文件中。我写了这个适用于 PCRE 的正则表达式:

(?<tag>(?&TAG)):\s*
(?<message>.*?)
(
<
(?<author>(?:\w{3}\s*,\s*)*\w{3})?\s*
(?<date>(?&DATE))?
(?<flags>(?&FLAGS))?
>
)?
$

(?(DEFINE)
(?<TAG>\b(NOTE|LEGACY|HACK|TODO|FIXME|XXX|BUG))
(?<DATE>\d{4}-\d{2}-\d{2})
(?<FLAGS>[pts]:\w+\b)
)

不幸的是,Python 似乎不理解定义 (https://regex101.com/r/qH1uG3/1#pcre)

Python 中最好的解决方法是什么?

最佳答案

正则表达式模块的方式:

如评论中所述,正则表达式模块允许重用命名子模式。不幸的是,没有像 Perl 或 PCRE 中那样的 (?(DEFINE)...) 语法。

因此,方法是使用与 Ruby 语言相同的解决方法,即在您想要定义命名子模式时放置一个 {0} 量词:

import regex

s = r'''
// NOTE: A small example
// HACK: Another example <ABC 2014-02-03>
// HACK: Another example <ABC,DEF 2014-02-03>
// HACK: Another example <ABC,DEF p:0>
'''

p = r'''
# subpattern definitions
(?<TAG> \b(?:NOTE|LEGACY|HACK|TODO|FIXME|XXX|BUG) ){0}
(?<DATE> \d{4}-\d{2}-\d{2} ){0}
(?<FLAGS> [pts]:\w+ ){0}

# main pattern
(?<tag> (?&TAG) ) : \s*
(?<message> (?>[^\s<]+[^\n\S]+)* [^\s<]+ )? \s* # to trim the message
<
(?<author> (?: \w{3} \s* , \s* )*+ \w{3} )? \s*
(?<date> (?&DATE) )?
(?<flags> (?&FLAGS) )?
>
$
'''

rgx = regex.compile(p, regex.VERBOSE | regex.MULTILINE)

for m in rgx.finditer(s):
print (m.group('tag'))

注意:子模式也可以在模式的末尾定义。

关于python - 如何使用 (?(DEFINE)) 在 Python 中编写正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450371/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com