Python论坛  - 讨论区

标题:[python-chinese] 『问题』正则表达式

2007年11月26日 星期一 14:58

clfff.peter clfff.peter在gmail.com
星期一 十一月 26 14:58:55 HKT 2007

ÎÒÏëÆ¥ÅäÕÒµ½º¯Êý£¬ÏÂÃæÊǺ¯Êý¿ÉÄܵÄÐÎʽ£º
virtual HRUSULT int Func(int param1, int param2, int param3);
ÏÂÃæÊÇÎÒµÄÕýÔò±í´ïʽ£º
(\w+\s*)+\((\s*\w+(\s+\w+)?,*)*\)
ËäÈ»¿ÉÒÔÓ㬵«ÊÇ·µ»ØµÄgroup²»ÊÇÎÒÏëÒªµÄ£¬ÎÒÏ£ÍûµÃµ½·µ»ØÀàÐÍ£ºint£¬º¯ÊýÃû£ºFunc£¬²ÎÊýÁÐ±í£º["int param1", "int
param2", "int param3"]£¬µ«ÊǺÃÏñgroupÖ»ÄÜ·µ»Ø×îºóÒ»¸öÆ¥Å䣬¶ø֮ǰµÄÆ¥ÅäÎÞ·¨µÃµ½¡£
»òÕßÕâô˵£¬¿ªÊ¼µÄ(\w+\s*)+ÄÜÆ¥Åävirtual HRUSULT int
Func£¬µ«ÊÇÈ´Ö»Äܵõ½Func£¬¶øÇ°ÃæµÄint¡¢HRUSULT¡¢virtualµÈ¶¼ÊÇÎÞ·¨»ñµÃµÄ¡£
ÇëÎÊÓÐʲô°ì·¨¿ÉÒԵõ½ÒÔÏÂÄÚÈÝ£º
·µ»ØÀàÐÍ£ºint£¬º¯ÊýÃû£ºFunc£¬²ÎÊýÁÐ±í£º["int param1", "int param2", "int param3"]
лл¡£
^__^
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071126/c312d222/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月26日 星期一 19:26

R Y digitalwit在gmail.com
星期一 十一月 26 19:26:50 HKT 2007

把int,函数名:Func,参数列表分三个组,然后用.group(1), .group(2) .group(3) 分别取出来。关键在你的正则表达式分组。

On 11/26/07, clfff. peter <clfff.peter at gmail.com> wrote:
> 我想匹配找到函数,下面是函数可能的形式:
> virtual HRUSULT int Func(int param1, int param2, int param3);
> 下面是我的正则表达式:
> (\w+\s*)+\((\s*\w+(\s+\w+)?,*)*\)
> 虽然可以用,但是返回的group不是我想要的,我希望得到返回类型:int,函数名:Func,参数列表:["int param1", "int
> param2", "int param3"],但是好像group只能返回最后一个匹配,而之前的匹配无法得到。
> 或者这么说,开始的(\w+\s*)+能匹配virtual HRUSULT int
> Func,但是却只能得到Func,而前面的int、HRUSULT、virtual等都是无法获得的。
> 请问有什么办法可以得到以下内容:
> 返回类型:int,函数名:Func,参数列表:["int param1", "int param2", "int param3"]
> 谢谢。
> ^__^
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月26日 星期一 22:10

Leo Jay python.leojay在gmail.com
星期一 十一月 26 22:10:30 HKT 2007

On Nov 26, 2007 2:58 PM, clfff. peter <clfff.peter在gmail.com> wrote:
> 我想匹配找到函数,下面是函数可能的形式:
> virtual HRUSULT int Func(int param1, int param2, int param3);
> 下面是我的正则表达式:
> (\w+\s*)+\((\s*\w+(\s+\w+)?,*)*\)
> 虽然可以用,但是返回的group不是我想要的,我希望得到返回类型:int,函数名:Func,参数列表:["int param1", "int
> param2", "int param3"],但是好像group只能返回最后一个匹配,而之前的匹配无法得到。
> 或者这么说,开始的(\w+\s*)+能匹配virtual HRUSULT int

是这样的,你写(\w+\s*)+,这样,那对括号里实际上会match到4组,
分别是'virtual ', 'HRUSULT ', 'int '和'Func',这时,返回的结果是最后一组,即那个'Func'。
如果你想得到match到的整个(\w+\s*)+,那你要在外面加个括号。由于你并不想得到里面每一个单词,所以
里面那个括号是匿名(non-group)的。所以,你应该这样写:((?:\w+\s*)+)
详细解释请见python手册的re模块的说明。

> Func,但是却只能得到Func,而前面的int、HRUSULT、virtual等都是无法获得的。
> 请问有什么办法可以得到以下内容:
> 返回类型:int,函数名:Func,参数列表:["int param1", "int param2", "int param3"]
> 谢谢。
> ^__^

这样的程序不知道是不是你想要的:

a = r'virtual HRUSULT int Func(int param1, int param2, int param3); '
r = re.compile(r'(\w+)\s+(\w+)\s*\((.*)\)')
print r.findall(a)

输出的结果是一个列表,列表里的每个元素是一个元组,每个元组里有3个元素,分别是返回类型,函数名和参数的列表。
其中,参数的列表你要自己split(',')一下。

-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月27日 星期二 11:43

clfff.peter clfff.peter在gmail.com
星期二 十一月 27 11:43:58 HKT 2007

ËäÈ»ÄãµÄ·½·¨²»ÊǺÜÍêÃÀ£¬²»¹ýÌáʾÁËÒ»µã£¬¾ÍÊÇ£º
1¡·²»Ó¦¸ÃÍêÈ«ÒÀ¿¿ÕýÔò£¬¶øÓ¦¸Ã»ìºÏ¸÷ÖÖ·½·¨£»
2¡·»òÕß²»Ó¦¸ÃÒÀ¿¿Ò»¸öÕýÔò£¬¶øÊǷֳɼ¸²½£¬Ã¿Ò»²½ÖÐÓÐÒ»¸öÕýÔò£¬ÕâÑùÒ»²ã²ãµÄ½âÎö¡£
²»ÖªµÀ´ó¼ÒÔÚʵ¼ÊÏîÄ¿ÖÐÊDz»ÊÇÕâÑù×öµÄ£¿
¸øµã½¨Òé¡£

»¹ÓиöÎÊÌ⣺
"ËùÒÔ£¬ÄãÓ¦¸ÃÕâÑùд£º((?:\w+\s*)+)"£¬ÆäÖÐ(?:..)µÄ½âÊÍÊÇ£ºNo-Capturing
Parenthesis£¬²»Ì«Ã÷°×£¬¶øÇÒÓÐûÓÐËüºÃÏñûʲôÇø±ðѽ¡£Äܲ»ÄܽâÊÍÏ¡£

лл¡£^__^


ÔÚ07-11-26£¬Leo Jay <python.leojay在gmail.com> дµÀ£º
>
> On Nov 26, 2007 2:58 PM, clfff. peter <clfff.peter在gmail.com> wrote:
> > ÎÒÏëÆ¥ÅäÕÒµ½º¯Êý£¬ÏÂÃæÊǺ¯Êý¿ÉÄܵÄÐÎʽ£º
> > virtual HRUSULT int Func(int param1, int param2, int param3);
> > ÏÂÃæÊÇÎÒµÄÕýÔò±í´ïʽ£º
> > (\w+\s*)+\((\s*\w+(\s+\w+)?,*)*\)
> > ËäÈ»¿ÉÒÔÓ㬵«ÊÇ·µ»ØµÄgroup²»ÊÇÎÒÏëÒªµÄ£¬ÎÒÏ£ÍûµÃµ½·µ»ØÀàÐÍ£ºint£¬º¯ÊýÃû£ºFunc£¬²ÎÊýÁÐ±í£º["int param1", "int
> > param2", "int param3"]£¬µ«ÊǺÃÏñgroupÖ»ÄÜ·µ»Ø×îºóÒ»¸öÆ¥Å䣬¶ø֮ǰµÄÆ¥ÅäÎÞ·¨µÃµ½¡£
> > »òÕßÕâô˵£¬¿ªÊ¼µÄ(\w+\s*)+ÄÜÆ¥Åävirtual HRUSULT int
>
> ÊÇÕâÑùµÄ£¬Äãд(\w+\s*)+£¬ÕâÑù£¬ÄǶÔÀ¨ºÅÀïʵ¼ÊÉÏ»ámatchµ½4×飬
> ·Ö±ðÊÇ'virtual ', 'HRUSULT ', 'int 'ºÍ'Func'£¬Õâʱ£¬·µ»ØµÄ½á¹ûÊÇ×îºóÒ»×飬¼´ÄǸö'Func'¡£
> Èç¹ûÄãÏëµÃµ½matchµ½µÄÕû¸ö(\w+\s*)+£¬ÄÇÄãÒªÔÚÍâÃæ¼Ó¸öÀ¨ºÅ¡£ÓÉÓÚÄã²¢²»ÏëµÃµ½ÀïÃæÿһ¸öµ¥´Ê£¬ËùÒÔ
> ÀïÃæÄǸöÀ¨ºÅÊÇÄäÃû(non-group)µÄ¡£ËùÒÔ£¬ÄãÓ¦¸ÃÕâÑùд£º((?:\w+\s*)+)
> Ïêϸ½âÊÍÇë¼ûpythonÊÖ²áµÄreÄ£¿éµÄ˵Ã÷¡£
>
> > Func£¬µ«ÊÇÈ´Ö»Äܵõ½Func£¬¶øÇ°ÃæµÄint¡¢HRUSULT¡¢virtualµÈ¶¼ÊÇÎÞ·¨»ñµÃµÄ¡£
> > ÇëÎÊÓÐʲô°ì·¨¿ÉÒԵõ½ÒÔÏÂÄÚÈÝ£º
> > ·µ»ØÀàÐÍ£ºint£¬º¯ÊýÃû£ºFunc£¬²ÎÊýÁÐ±í£º["int param1", "int param2", "int param3"]
> > лл¡£
> > ^__^
>
> ÕâÑùµÄ³ÌÐò²»ÖªµÀÊDz»ÊÇÄãÏëÒªµÄ£º
>
> a = r'virtual HRUSULT int Func(int param1, int param2, int param3); '
> r = re.compile(r'(\w+)\s+(\w+)\s*\((.*)\)')
> print r.findall(a)
>
> Êä³öµÄ½á¹ûÊÇÒ»¸öÁÐ±í£¬ÁбíÀïµÄÿ¸öÔªËØÊÇÒ»¸öÔª×飬ÿ¸öÔª×éÀïÓУ³¸öÔªËØ£¬·Ö±ðÊÇ·µ»ØÀàÐÍ£¬º¯ÊýÃûºÍ²ÎÊýµÄÁÐ±í¡£
> ÆäÖУ¬²ÎÊýµÄÁбíÄãÒª×Ô¼ºsplit(',')һϡ£
>
> --
> Best Regards,
> Leo Jay
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071127/4dd2508f/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月27日 星期二 11:59

Leo Jay python.leojay在gmail.com
星期二 十一月 27 11:59:28 HKT 2007

On Nov 27, 2007 11:43 AM, clfff. peter <clfff.peter在gmail.com> wrote:
> 虽然你的方法不是很完美,不过提示了一点,就是:
> 1》不应该完全依靠正则,而应该混合各种方法;
> 2》或者不应该依靠一个正则,而是分成几步,每一步中有一个正则,这样一层层的解析。
> 不知道大家在实际项目中是不是这样做的?
> 给点建议。

用最好理解的方式解决问题。跟分几步没关系,你有一步解决又好懂的方法就用一步解决的方法。如果没有,那就分多步。

>
> 还有个问题:
> "所以,你应该这样写:((?:\w+\s*)+)",其中(?:..)的解释是:No-Capturing
> Parenthesis,不太明白,而且有没有它好像没什么区别呀。能不能解释下。
>

怎么会没区别,你自己试试就知道了:
>>> a = r'virtual HRUSULT int Func'
>>> re.findall(r'((\w+\s*)+)', a)
[('virtual HRUSULT int Func', 'Func')]
>>> re.findall(r'((?:\w+\s*)+)', a)
['virtual HRUSULT int Func']
>>>

默认情况下,所有的圆括号都组成一个group,但有的时候,我们使用圆括号并不是想
让它放到group里,只是想让后面的那个'+'号作用的范围是\w+\s*,所以要让这个括号不参与
group,这就是(?:...)的用处。

> 谢谢。^__^
>
>


-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月28日 星期三 10:59

clfff.peter clfff.peter在gmail.com
星期三 十一月 28 10:59:35 HKT 2007

·Ç³£Çå³þ£¬·Ç³£¸Ðл¡£¹þ¹þ¹þ

ÔÚ07-11-27£¬Leo Jay <python.leojay在gmail.com> дµÀ£º
>
> On Nov 27, 2007 11:43 AM, clfff. peter <clfff.peter在gmail.com> wrote:
> > ËäÈ»ÄãµÄ·½·¨²»ÊǺÜÍêÃÀ£¬²»¹ýÌáʾÁËÒ»µã£¬¾ÍÊÇ£º
> > 1¡·²»Ó¦¸ÃÍêÈ«ÒÀ¿¿ÕýÔò£¬¶øÓ¦¸Ã»ìºÏ¸÷ÖÖ·½·¨£»
> > 2¡·»òÕß²»Ó¦¸ÃÒÀ¿¿Ò»¸öÕýÔò£¬¶øÊǷֳɼ¸²½£¬Ã¿Ò»²½ÖÐÓÐÒ»¸öÕýÔò£¬ÕâÑùÒ»²ã²ãµÄ½âÎö¡£
> > ²»ÖªµÀ´ó¼ÒÔÚʵ¼ÊÏîÄ¿ÖÐÊDz»ÊÇÕâÑù×öµÄ£¿
> > ¸øµã½¨Òé¡£
>
> ÓÃ×îºÃÀí½âµÄ·½Ê½½â¾öÎÊÌâ¡£¸ú·Ö¼¸²½Ã»¹Øϵ£¬ÄãÓÐÒ»²½½â¾öÓֺö®µÄ·½·¨¾ÍÓÃÒ»²½½â¾öµÄ·½·¨¡£Èç¹ûûÓУ¬ÄǾͷֶಽ¡£
>
> >
> > »¹ÓиöÎÊÌ⣺
> > "ËùÒÔ£¬ÄãÓ¦¸ÃÕâÑùд£º((?:\w+\s*)+)"£¬ÆäÖÐ(?:..)µÄ½âÊÍÊÇ£ºNo-Capturing
> > Parenthesis£¬²»Ì«Ã÷°×£¬¶øÇÒÓÐûÓÐËüºÃÏñûʲôÇø±ðѽ¡£Äܲ»ÄܽâÊÍÏ¡£
> >
>
> Ôõô»áûÇø±ð£¬Äã×Ô¼ºÊÔÊÔ¾ÍÖªµÀÁË£º
> >>> a = r'virtual HRUSULT int Func'
> >>> re.findall(r'((\w+\s*)+)', a)
> [('virtual HRUSULT int Func', 'Func')]
> >>> re.findall(r'((?:\w+\s*)+)', a)
> ['virtual HRUSULT int Func']
> >>>
>
> ĬÈÏÇé¿öÏ£¬ËùÓеÄÔ²À¨ºÅ¶¼×é³ÉÒ»¸ögroup£¬µ«ÓеÄʱºò£¬ÎÒÃÇʹÓÃÔ²À¨ºÅ²¢²»ÊÇÏë
> ÈÃËü·Åµ½groupÀֻÊÇÏëÈúóÃæµÄÄǸö'+'ºÅ×÷Óõķ¶Î§ÊÇ\w+\s*£¬ËùÒÔÒªÈÃÕâ¸öÀ¨ºÅ²»²ÎÓë
> group£¬Õâ¾ÍÊÇ(?:...)µÄÓô¦¡£
>
> > лл¡£^__^
> >
> >
>
>
> --
> Best Regards,
> Leo Jay
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071128/84857e84/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号