正则表达式之管道符号|

今天用Ruby写了以下代码并进行了测试:

#正则表达式
line = gets
if line =~ /Perl|Python/  #如果在字符串中匹配了模式,=~返回字符串中匹配模式的开始位置
  puts "Scripting language mentioned: #{line}"
end

我认为/Perl|Python/的意思是匹配"Perl"或者匹配"Python",但是当字符串中既存在"Perl"又存在"Python"时结果如何呢?

我猜想Perl和Python谁在前面(指的是在待匹配字符串中的顺序而非/Perl|Python/中的顺序)就匹配谁,比如"PerlPython"就应当匹配Perl,"PythonPerl"就应当匹配Python。

测试结果如下:

#input: PythonPerl
#output: Scripting language mentioned: PythonPerl

#input: PerlPython
#output: Scripting language mentioned: PerlPython

#input: Perl455Python
#output: Scripting language mentioned: Perl455Python

难道既有Perl又有Python的时候会进行两次匹配?!怀着疑问又进行了如下测试:

#input: Perl1
#output: Scripting language mentioned: Perl1

#input: 1Perl
#output: Scripting language mentioned: 1Perl

咦,这是怎么回事?仔细思考后发现了问题所在,代码的第二行如下:

if line =~ /Perl|Python/  #如果在字符串中匹配了模式,=~返回字符串中匹配模式的开始位置

这就是我开始犯错的地方,我认为如果匹配成功,那么ruby会将匹配的字符串返回给line,但实际上:

  • 在我的这几行代码里,line的值从键盘读取了什么就是什么,从未改变过(=是赋值,=~是判断是否匹配)
  • =~返回的是字符串中匹配模式的开始位置,并不是匹配的字符串,因此我这个例子无法测试Perl和Python都存在的情况是否两个都匹配(实际上是只匹配一个,是或的关系
  • 表达式 line =~ /Perl|Python/ 的值才是 =~ 最终返回的值,要么是nil,要么是字符串中匹配模式的开始位置

测试代码改版:

line = gets
if line =~ /Perl|Python/ #匹配Perl或者Python,两者其中一个匹配成功即结束,否则匹配失败
  puts line =~ /Perl|Python/ #如果在字符串中发现了模式,=~返回(也即表达式line =~ /Perl|Python/的返回值)模式的开始位置
  puts "Scripting language mentioned: #{line}"#line的值始终为键盘输入的内容,从未改变过
end

#input: 1Perl
#output:

1

Scripting language mentioned: 1Perl

折腾了半天,以上代码并不能测试我想要测试的内容,反而我对 =~ 的理解更加深入了,又或者说我真正明白了上面这段代码的意思,也是不亦乐乎~

时间: 2024-10-12 11:36:34

正则表达式之管道符号|的相关文章

55分钟学会正则表达式

原文地址-Sam Hughes 翻译水平有限,如有谬误,欢迎评论斧正或者Pull Request. 正则表达式(“regexes”)即增强查找/字符串替换操作.当在文本编辑器中编辑文字时,正则表达式经常用于: 检查文本是否包含一个给定的模式 查找任何匹配的模式 从文本中拉取信息(比如截断) 修改文本 和文本编辑器一样,绝大多数高级编程语言支持正则表达式.在本文中,“文本”仅仅是一个字符串变量,但是有效的操作却是一致的.某些编程语言(Perl,JavaScript)甚至为正则表达式提供专用的语法.

python开发中对正则表达式及re模块的学习

正则表达式是个很牛逼的东西,不管是在javascript,还是在Python web开发(http://www.maiziedu.com/course/python-px/)中,我们都会遇到正则表达式,虽然javascript和Python的正则表达式区别不大,但是正则表达式是Python中必不可少的一部分,所以今天就跟大家一起讨论一下python中的re模块. re模块包含对正则表达式的支持. 什么是正则:  正则表达式是可以匹配文本片段的模式.  正则表达式'Python'可以匹配'pyth

正则表达式学习与python中的应用

目录: 一.正则表达式的特殊符号 二.几种重要的正则表达式 三.python的re模块应用 四.参考文献 一.正则表达式的特殊符号 特殊符号可以说是正则表达式的关键,掌握并且可以灵活运用重要的python符号,基本就搞定了正则表达式,不过我不敢说自己已经到了炉火纯青的地步. .(点号),该符号可以匹配任何的字符,当然要换行符除外.在python中,如果存在re.DOTALL,那么即使是换行符,也同样可以匹配,这个DOTALL就是一个标记flag. eg:re.compile(r'\b\w.’,r

学习正则表达式笔记(二)

正则匹配的各种模式 1.择一匹配(|) 择一匹配用管道符号(|),也就是竖线表示.代表可以从多个模式中选择一个,可用于分割正则表达式.例如: ABC | abc 表示即可以匹配 ABC,又可以匹配 abc. 2.匹配任意单个字符 点号(.)可以匹配除换行符 \n 以外的任意字符,无论是空格,字母,数字,可打印字符.不可打印字符,还是一个符号,使用点号都能够匹配它们. 在Python中,如果使用模块属性re.S 也就是 re.DOTALL,那么换行符 \n 也可以匹配了. 3.从字符串起始或者结尾

【Python爬虫学习笔记(3)】正则表达式(re模块)相关知识点总结

1. 正则表达式     正则表达式是可以匹配文本片段的模式. 1.1 通配符     正则表达式能够匹配对于一个的字符串,可以使用特殊字符创建这类模式.(图片来自cnblogs) 1.2 特殊字符的转义     由于在正则表达式中,有时需要将特殊字符作为普通字符处理,就需要用'\'进行转义,例如'python\\.org'就会匹配'python.org',那么为什么要用两个反斜杠呢,原因在于需要进行两层转义,首先是re模块表示正则表达式中需要转义一次,其次是python解释器即python的语

python的正则表达式 re

python的正则表达式 re 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用'\\\\'来做为正则表达式的字符串,因为正则表达式要是\\,而字符串里,每个反斜杆都要写

Python开发基础-Day14正则表达式和re模块

正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 字符匹配(普通字符,元字符): 1 普通字符(完全匹配):大多数字符和字母都会和自身匹配 1 >>> import re 2 >>> res='hello world good morning' 3 >>> re.findall(

python基础之正则表达式和re模块

正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 字符匹配(普通字符,元字符): 1 普通字符(完全匹配):大多数字符和字母都会和自身匹配 1 >>> import re 2 >>> res='hello world good morning' 3 >>> re.findall(

Python基础----正则表达式和re模块

正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 字符匹配(普通字符,元字符): 1 普通字符(完全匹配):大多数字符和字母都会和自身匹配 1 >>> import re 2 >>> res='hello world good morning' 3 >>> re.findall(