如何在 Python 正则表达式中使用 OR 运算符?

How to use OR operator in Python Regex?

我有两种不同类型的 OS,return 和 service tomcat status 输出不同。

我有一个获取 tomcat 进程 ID 的方法。

def find_pid(pattern,status):
    m = re.match(pattern, status, re.DOTALL)
    pid = m.groups(0)[0]
    return(pid)
print(find_pid(pattern,status))

OS type1 service tomcat status returns

status = 'jsvc (pid  2164) is running...'

用于获取 PID 的模式

pattern = '.*pid\s+(\d+).*running.*'
print(find_pid(pattern,status))           >>> 2164

OS type2 service tomcat status returns

status = '''tomcat.service - Tomcat Server
   Loaded: loaded ( enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-11-18 13:33:00 PST; 1min 47s ago
 Main PID: 2800 (jsvc)
   CGroup: /system/tomcat.service
'''

用于获取 PID 的模式

pattern = '.*PID:\s+(\d+).*'
print(find_pid(pattern,status))          >>> 2800

现在我不想检查 OS 的类型,也不想为不同的 OS.

发送不同的模式

无论我们检查的是哪种类型OS,该模式都应该能够获取PID,

我通过将以上两种模式与“|”结合起来创建了一个方法运算符。

def find_pid(status):
    pattern = '.*pid\s+(\d+).*running.*|.*PID:\s+(\d+).*'
    m = re.match(pattern, status, re.DOTALL)
    pid = m.groups(0)[0]
    return(pid)
print(find_pid(status))

此方法不适用于任何一种状态。

我需要一个匹配两种状态类型的模式,return 我需要它的 PID。

PS:如果可能的话,我需要在 python 2 和 3 中都能工作的解决方案。因为 python2 中的测试虚拟机 运行 很少,而且很少运行 在 python3 环境中。 (正在将 2 移植到 3)。

考虑测试用例:

jsvc (pid  2164) is running...

tomcat.service - Tomcat Server
   Loaded: loaded ( enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-11-18 13:33:00 PST; 1min 47s ago
 Main PID: 2800 (jsvc)
   CGroup: /system/tomcat.service

我建议使用以下通用模式

r".*[Pp][Ii][Dd]:?\s+(\d+)"

请注意,我使用 [Pp][Ii][Dd] 接受任何情况而无需使用标志,如果您控制标志,则可以使用 re.IGNORECASE 代替,例如

import re
test1 = '''jsvc (pid  2164) is running...'''
test2 = '''tomcat.service - Tomcat Server
   Loaded: loaded ( enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-11-18 13:33:00 PST; 1min 47s ago
 Main PID: 2800 (jsvc)
   CGroup: /system/tomcat.service'''
print(re.search(r".*pid:?\s+(\d+)", test1, re.IGNORECASE).group(1))
print(re.search(r".*pid:?\s+(\d+)", test2, re.IGNORECASE).group(1))

输出

2164
2800

您可以使用不区分大小写的匹配项,标记 re.I:?,因为并非两个字符串在 PID 之前都有 :(\d{1,5}) 来对数字进行分组(最多 5 个,假设 os-limits).

import re

os1_status = 'jsvc (pid  2164) is running...'
os2_status = '''tomcat.service - Tomcat Server
   Loaded: loaded ( enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-11-18 13:33:00 PST; 1min 47s ago
 Main PID: 2800 (jsvc)
   CGroup: /system/tomcat.service
'''

for status in (os1_status, os2_status):
    match = re.search(r'pid:?\s+(\d{1,5})', status, re.I)
    print(match.group(1))