正则表达式使用单个字符的括号

时间:2019-05-29 03:23:42

标签: regex string regex-lookarounds regex-group

我正在解决此正则表达式问题

  

给出测试字符串s,在以下条件下编写与s匹配的RegEx:

     

必须以先生,夫人,女士或博士开头。

     

字符串的其余部分只能包含一个或多个英文字母(大写和小写)。

我使用了这种模式

Regex_Pattern = r'^(Mr|Mrs|Ms|Dr|Er)\..[A-Za-z]+$'

但该测试用例“ Ms._underscore”失败,然后我尝试使用此模式

Regex_Pattern = r'^(Mr|Mrs|Ms|Dr|Er)[\..][A-Za-z]+$'

它通过了所有测试用例,我无法找出区别。

2 个答案:

答案 0 :(得分:3)

在这里,我们可以可视化表达式并检查:

enter image description here

enter image description here

我们可以看到\..[\..]之间是有区别的。

  • 在第一个中,我们说我们必须有一个.,后跟任何字符。
  • 第二,我们只想传递..中的一个,它等于[.]

Demo for second expression

RegEx电路

jex.im可视化正则表达式:

答案 1 :(得分:1)

我认为您可能将两种模式颠倒了。第二个不匹配,第一个匹配:

^(Mr|Mrs|Ms|Dr|Er)\..[A-Za-z]+$
Demo 1

^(Mr|Mrs|Ms|Dr|Er)[\..][A-Za-z]+$
Demo 2

第二个字符使用字符类[\..],该字符类删除任何正则表达式标记的特殊含义(例如.中的[]匹配字面量而不是其特殊含义(任何字符)。

第一个模式与文字句点相匹配,后跟换行符以外的任何单个字符。有关详细信息,请查看上面的演示链接右侧的“说明”。

更新:您的模式也将匹配 Ms.underscore (标题和名称之间没有空格)。因此,请考虑以下模式,我认为该模式更适合您的需求:

^(Mr|Mrs|Ms|Dr|Er)\.[ _][A-Za-z]+$
Demo 3