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 正则表达式合并的问题如何解决?
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
, 帮忙删除下这个帖子,没注意泄漏了不少信息。。

