Python 正则表达式合并的问题如何解决?

pattern = re.compile(r'port (\d+)') pattern1 = re.compile(r'Logon ID:\t\t(\w+)\r\n\tLogon')

怎么写才能把这 2 个合并到一起然后返回 ()即 \d+ \w+中的匹配呢? 分开写匹配正常

试着如果写成

pattern = re.compile(r'port (\d+)|Logon ID:\t\t(\w+)\r\n\tLogon')

这样会匹配不到返回 none

而如果写成

pattern = re.compile(r'( port (\d+))|( Logon ID:\t\t(\w+)\r\n\tLogon )')

这样返回的又是 整个括号中的字段,port (\d+)或者 Logon ID:\t\t(\w+)\r\n\tLogon )


Python 正则表达式合并的问题如何解决?

10 回复

In [3]: re.compile(r’port(\d+)|Logon ID(\d+)’)
Out[3]: re.compile(r’port(\d+)|Logon ID(\d+)’)

In [4]: p1 = re.compile(r’port(\d+)|Logon ID(\d+)’)

In [5]: p1.match(‘Logon ID8Logon’)
Out[5]: <_sre.SRE_Match at 0x1099fee00>

In [6]: m = p1.match(‘Logon ID8Logon’)

In [7]: m.groups()
Out[7]: (None, ‘8’)

In [8]: m
Out[8]: <_sre.SRE_Match at 0x109e43030>

In [9]: m2 = p1.match(‘port5’)

In [10]: m2
Out[10]: <_sre.SRE_Match at 0x109e430b8>

In [11]: m2.groups()
Out[11]: (‘5’, None)


帖子回复:

正则表达式合并,我理解你是想把多个正则模式组合成一个,或者匹配多个模式中的任意一个。最直接的方法是使用管道符 | 或者用圆括号 () 分组。

1. 使用管道符 | (OR 操作): 这是最简单的方式,匹配 pattern1 pattern2。

import re

pattern = re.compile(r'cat|dog')
text = "I have a cat and a dog."
matches = pattern.findall(text)
print(matches)  # 输出: ['cat', 'dog']

2. 使用分组 () 进行组合: 如果你想匹配更复杂的组合,比如“数字+cat”或者“数字+dog”,分组就很有用。

import re

pattern = re.compile(r'(\d+)\s+(cat|dog)')
text = "I have 2 cats and 1 dog."
matches = pattern.findall(text)
print(matches)  # 输出: [('2', 'cat'), ('1', 'dog')]
# 每个匹配是一个元组,包含分组捕获的内容。

3. 动态构建复杂模式: 如果模式是动态生成的,可以先拼接字符串,再编译。

import re

base_patterns = [r'\d+', r'[a-z]+', r'[A-Z]+']
combined_pattern = '|'.join(f'({p})' for p in base_patterns)
# 结果类似: r'(\d+)|([a-z]+)|([A-Z]+)'

pattern = re.compile(combined_pattern)
text = "Test123"
matches = pattern.findall(text)
print(matches)  # 输出: [('123', '', ''), ('', 'est', '')]
# 注意:findall 对包含分组的模式返回元组列表,未匹配到的分组为空字符串。

关键点总结:

  • 简单“或”逻辑:直接用 |
  • 需要捕获分组:用 (pattern1|pattern2)
  • 模式是动态的:用字符串拼接 '|'.join(patterns)re.compile

一句话建议: 根据你是要简单“或”匹配还是需要分组捕获,选择用 |() 来合并你的正则表达式。

#1 应该都能匹配出来的,只是匹配到的结果在 groups 的不同 index 里吧

用 ?: ?P 和 groupdict()

http://ideone.com/qFhwVd

你都拿到 dict 了想怎么办就怎么办呗。

if xxx.groupdict()[‘id’] is not None:

elif xxx.groupdict()[‘port’] is not None:

代码字节数有限制……所以想尽量一次搞定啊

from typing import Optional, Match, Pattern, Tuple
import re


def matchs(target: str) -> Optional[str]:
pat: Pattern[str] = re.compile(r"port\s*(\d+)|Logon ID:\s*(\w+)")
res: Optional[Match[str]] = re.search(pat, target)
if res:
g: Tuple[Optional[str], Optional[str]] = res.groups()
return g[0] if g[0] else g[1]
return None

, 帮忙删除下这个帖子,没注意泄漏了不少信息。。

回到顶部