如何在 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))
我有两种不同类型的 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))