设为首页 收藏本站
查看: 511|回复: 0

[经验分享] 正则表达式使用学习(C++、Qt、Python)

[复制链接]

尚未签到

发表于 2017-5-4 09:58:21 | 显示全部楼层 |阅读模式

写在前面



个人对于正则表达式实在是不太了解,所以本文内容纰漏应该会比较多。只希望不会对大家造成误导。
本文只是简单涉及C++0x、Qt4、Python3、Vim中的正则表达式:




  • C++0x:在 regexp 头文件中提供一系列模板类



  • Qt4:中提供了 QRegExp 类



  • Python3:中提供了 re 模块



  • Vim:命令模式和脚本支持正则


晕,写了一上午,竟然写成了这样了,Vim竟然都没涉及,其他部分也是一团糟,额,本来是想整理它们之间的在pattern上的区别的。不管了,先这样吧。
2011.08.20


用途



两个问题+三个动作?(真不知道该如何分类了...):




  • match: 字符串匹配这个模式(pattern)么?



  • search: 字符串中存在和模式匹配的字串么?



  • capture: 捕获匹配的字符串



  • replace: 替换字符串(子串)



  • split: 分割字符串



使用




准备pattern字符串



这个?元字符、匹配单个字符、重复匹配等,似乎相关的资料太多了哈,这儿暂时省略。
Python提供raw字符串的字面量写法,C++0x也提供了这种功能,只是编译器目前似乎都尚不支持。

//C++0x
const char * str1 = "C://windows//system32";
const char * str2 = R"(C/windows/system32)";


生成pattern对象





Python



re.compile(pattern, flags=0)生成对象




Qt



使用QRegExp构造函数,可通过QRegExp::setPattern()修改




C++0x



通过模板类basic_regex构造





Python 下面,通过 re.compile() 可以生成一个正则表达式对象(Regular Expression Objects)

>>> import re
>>> re.compile(r"dbzhang8\d{2}")
<_sre.SRE_Pattern object at 0xb731c720>
>>>




  • 如果稍后只是使用re模块级的函数,比如re.match(r"dbzhang8\d{2}","dbzhang800"),那么不必先使用compile生成正则表达式对象。

C++0x 和 Qt 下,直接使用构造函数生成对象

QRegExp qt_pattern("dbzhang8\\d{2}");
std::regex cpp_pattern("dbzhang8\\d{2}");




  • 在C++0x中,有char,wchar_t,char16_t,char32_t 这4种字符类型,std::regex 只是一个别名typedefbasic_regex<char>regex;


执行匹配操作



看看Python



match()



判断RE是否从字符串“开头”开始匹配



成功则返回一个MatchObject对象,否则返回None



这4个函数均有模块级 和 对象的成员函数两种形式。区别在于后者需要先编译一个正则表达式对象,该对象可以重复使用。




search()



扫描字符串,看是否有匹配的字串




findall()



查找所有匹配的字串,将它们作为一个list返回





finditer()



查找所有匹配的字串,将它们以迭代器(iterator)返回







  • 简单的例子:
    >>> p = re.compile(r"dbzhang8\d{2}")
    >>> print(p.match("dbzhang-800"))
    None
    >>> p.match("dbzhang801")
    <_sre.SRE_Match object at 0xb71d3fa8>
    >>> p.findall("dbzhang801dbzhang802")
    ['dbzhang801', 'dbzhang802']


    注意:MatchObject包含匹配信息,可以用来提取匹配的字符串

看看Qt



QRegExp::exactMatch()



判断字符串是否完全(从头到尾)匹配,返回真或假



这3个操作都会设置 matchedLength()、capturedTexts()、pos()的信息,类似于前面python中的MatchObject




QRegExp::indexIn()



搜索字符串以找到匹配的字串,返回索引值,失败返回-1




QRegExp::lastIndexIn()



同上,只是从后向前搜索




QString::indexOf()




如果只是查找的话,这两个更方便,只是无法获取额外的capturedTexts等信息了




QString::contains()



是否匹配




QString::count()



多少次匹配





恩,看看C++0x



regex_match()



表达式是否完整匹配一个字符串?



返回值是布尔量,但执行时会填充一个match_results对象,以用来进行字串捕捉。注意:这些是算法,不是前面提到的basic_regex的成员函数。




regex_search()



是否匹配字符串的一部分?






看看Capture信息?



要Capture字串的话,正则的pattern需要使用圆括号“()”包住一部分。
前面看到,match、search、index、... 等操作,都会通过其他方式填充一些额外的信息




  • Python 中生成一个 MatchObject 对象

  • C++ 0x 填充 match_result 对象
  • Qt 通过QRegExp对象自身 matchedLength()、capturedTexts()、pos() 的成员函数

Python



group()



返回匹配的字符串



需指定哪一个(或哪几个)组,默认是0组(匹配自身)




start()



返回匹配的起始位置




end()



返回匹配的结束位置




span()



返回包含起始和结束位置的元组(tuple)




groups()



返回所有匹配的组






Qt 中:



matchedLength()



匹配的长度





captureCount()



表达式中含有的捕捉组的数目





capturedTexts()



捕捉到的字符串列表




pos(int n)



第n个组的位置




cap(int n)



第n个组的内容(0代表匹配自身)





C++0x 中:



match_results::operator[](size_type n)



返回第n个捕捉组(0代表匹配自身)



返回的是sub_match模板类的对象




match_results::prefix()



返回被匹配子串前面的串




match_results::suffix()



返回被匹配子串后面的串




match_results::empty()



只在匹配失败是返回true





match_results::size()



组的数目





match_results::str()



组的内容





match_results::position()



位置






  • 4个别名:
    typedef match_results<const char*> cmatch;
    typedef match_results<const wchar_t*> wcmatch;
    typedef match_results<string::const_iterator> smatch;
    typedef match_results<wstring::const_iterator> wsmatch;


执行修改操作



Python



split()



分割字符串



可指定最大分割或替代的数目




sub()



替换所有匹配的子串




subn()



同上,但同时返回多少次替换发生(返回的是元组)





Qt中:



QString::split()



全是QString的成员函数,简单明了




QString::section()




QString::replace()




QString::remove()





C++0x中:



regex_replace()



就这一个么?呵呵






参考






  • http://docs.python.org/howto/regex.html



  • http://docs.python.org/py3k/library/re.html



  • http://doc.qt.nokia.com/4.7/qstring.html



  • http://doc.qt.nokia.com/4.7/qregexp.html



  • http://www.greenend.org.uk/rjk/2002/06/regexp.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372846-1-1.html 上篇帖子: python学习笔记2——第一章 语法入门 下篇帖子: java与python多线程wait,notify操作比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表