如何使用逻辑运算符在正则表达式的模式中添加两个子模式?

2024-10-02 16:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在聊天组中工作,我想获取发送消息的用户的号码或姓名

我创建了一个模式来获取电话号码,然后我拨打了patternnumber。我不知道如何在模式中使用逻辑运算符

re.search(r'[a-zA-Z]{3,}','11/09/2017 21:46 - Robert: Hello world\n')

<re.Match object; span=(19, 25), match='Robert'>

然而

re.search(patternnumber or r'[a-zA-Z]{3,}','11/09/2017 21:46 - Robert: Hello world\n')

什么也没给我

我已经尝试使用|而不是“or”,但它给出了一个错误。我怎样才能解决这个问题

编辑:

下面的一个答案部分解决了我的第一个问题,请参见:

re.search(r'patternnumber|[a-zA-Z]{3,}','11/09/2017 21:46 - Robert: Hello world\n')
<re.Match object; span=(19, 25), match='Robert'>

好的,但是当我添加电话号码而不是姓名时,我有另一个问题:

patternnumber = r'(\(|\+)*\d{1,3}\)* \(*\d{2,5}\)* \d{2,7}((\-|\s)\d{2,5})*((\-|\s)\d{2,5})*'
re.search(r'patternnumber|[a-zA-Z]+','13/09/2017 22:10 - +55 85 8507-4394: Hello world\n')

<re.Match object; span=(37, 42), match='Hello'>
re.search(r'(\(|\+)*\d{1,3}\)* \(*\d{2,5}\)* \d{2,7}((\-|\s)\d{2,5})*((\-|\s)\d{2,5})*|[a-zA-Z]+','13/09/2017 22:10 - +99 99 9999-9999: Hello world\n')
<re.Match object; span=(19, 35), match='+99 99 9999-9999'>

这应该是我所期望的答案

我不知道发生了什么,模式是一样的,区别在于一个是我之前创建的变量,另一个是我直接调用的变量:


Tags: orrehelloworldsearchobjectmatch模式
2条回答

代码无法工作的原因是or语句在启动search之前得到了求值。or语句将返回其中的第一个非空字符串

如果第一个字符串为空,第二个字符串为空,则将使用第二个字符串。如果两者都不是空的,则将使用第一个字符串。在本例中,patternnumber不是一个空字符串,因此它使用patternnumber进行搜索,不返回任何内容

or从括号中取出:

re.search(patternnumber, '11/09/2017 21:46 - Robert: Hello world\n') or re.search(r'[a-zA-Z]{3,}','11/09/2017 21:46 - Robert: Hello world\n')

可以在正则表达式中使用“|”运算符

re.search(r'(patternnumber|[a-zA-Z]{3,})','11/09/2017 21:46 - Robert: Hello world\n')

其中,patternnumber应该是写出的正则表达式,而不是变量

相关问题 更多 >