Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式模式定义(不包括字符)_Python_Regex - Fatal编程技术网

Python正则表达式模式定义(不包括字符)

Python正则表达式模式定义(不包括字符),python,regex,Python,Regex,我正在用Python编写一个简单的Java源文件解析器。主要目标是提取方法声明列表。方法以public | private | protected开头(我假设没有不带访问修饰符的友好的方法,这在我的代码库中是可以接受的),以{结尾,但不能包含;(可以是多行) 因此,我当前的regex模式如下所示: ((public|private|protected).*\n*.*?({|;)) 我不知道如何说整个比赛组不能包含;,所以我想说给我一些以{或;结尾的东西,以先到者为准,不贪婪。但是,这不起作用,

我正在用
Python
编写一个简单的
Java
源文件解析器。主要目标是提取方法声明列表。方法以
public | private | protected
开头(我假设没有不带访问修饰符的
友好的
方法,这在我的代码库中是可以接受的),以
{
结尾,但不能包含
(可以是多行)

因此,我当前的
regex
模式如下所示:

((public|private|protected).*\n*.*?({|;))
我不知道如何说整个比赛组不能包含
,所以我想说给我一些以
{
结尾的东西,以先到者为准,不贪婪。但是,这不起作用,下面是一个失败的部分:

private static final AtomicInteger refCount = new AtomicInteger(0);

protected int getSomeVar() {
您可以看到,在方法声明之前有一个变量声明,它以
private
开头,但没有
{
。因此,这是作为一个匹配项返回的,我希望它作为两个匹配项,然后我将在单独的非正则表达式逻辑中丢弃变量声明。但是如果您知道如何在
{
之前排除
,这也会起作用


从本质上讲,如何在Python正则表达式中指出某个字符(或子模式)不能出现在主模式中?

可以使用否定字符类来表示“除(换行符或)左大括号或分号以外的任何字符”

这最终奏效了:

((public|private|protected)[^;{]*?{)

请注意,我必须在第一个{

之前指定排除
{
,我想到的最简单的方法是使用另一个正则表达式来消除包含这些特定字符的正则表达式,因此如果(re.match(“.*”),则您的内容==None):那么您知道字符串中没有分号了吗?我希望有一个稍微优雅一点的字符串。我不明白您为什么要把事情复杂化,这还不够,还是我遗漏了什么?我需要\n多行declarations@amphibient
(?s)
设置
s
修饰符以将换行符与
(点)匹配因此,如果设置了
s
修饰符,那么
*?
将匹配换行符。我对此有问题。它确实排除了
符号,但直到第一个符号之前,我一直都在使用该符号;,甚至多个{sUpdated:我也在排除表达式中添加了左大括号。如果您没有使用点
则设置
(?s)
将不起作用。
((public|private|protected)[^;{]*?{)