繁体   English   中英

如何用命名组在Python中编写正则表达式以匹配此规则?

[英]How to write a regex in Python with named groups to match this?

我有一个文件,其中包含以下几行。

comm = adbd pid = 11108 prio = 120成功= 1 target_cpu = 001

我写了以下正则表达式来匹配。

_sched_wakeup_pattern = re.compile(r"""
comm=(?P<next_comm>.+?)
\spid=(?P<next_pid>\d+)
\sprio=(?P<next_prio>\d+)
\ssuccess=(?P<success>\d)
\starget_cpu=(?P<target_cpu>\d+)
""", re.VERBOSE)

但是现在我也有类似以下内容的行,其中没有成功组件。

comm = rcu_preempt pid = 7 prio = 120 target_cpu = 007

如何在这里修改我的正则表达式以匹配两种情况? 我尝试通过在包含“成功”的那一行到处都放置*,但是会引发错误。

使用正则表达式非捕获组regex.findAll函数的解决方案:

import regex
...
fh = open('lines.txt', 'r');  // considering 'lines.txt' is your initial file
commlines = fh.read()

_sched_wakeup_pattern = regex.compile(r"""
comm=(?P<next_comm>[\S]+?)
\spid=(?P<next_pid>\d+)
\sprio=(?P<next_prio>\d+)
(?:\ssuccess=)?(?P<success>\d)?
\starget_cpu=(?P<target_cpu>\d+)
""", regex.VERBOSE)

result = regex.findall(_sched_wakeup_pattern, commlines)

template = "{0:15}|{1:10}|{2:9}|{3:7}|{4:10}" # column widths
print(template.format("next_comm", "next_pid", "next_prio", "success", "target_cpu")) # header

for t in result:
    print(template.format(*t))

美化的输出:

next_comm      |next_pid  |next_prio|success|target_cpu
rcu_preempt    |7         |120      |       |007       
kworker/u16:2  |73        |120      |       |006       
kworker/u16:4  |364       |120      |       |005       
adbd           |11108     |120      |1      |001       
kworker/1:1    |16625     |120      |1      |001       
rcu_preempt    |7         |120      |1      |002     

匹配01重复(your_string)?

_sched_wakeup_pattern = re.compile(r"""
comm=(?P<next_comm>.+?)
\spid=(?P<next_pid>\d+)
\sprio=(?P<next_prio>\d+)
\s?(success=(?P<success>\d))?
\starget_cpu=(?P<target_cpu>\d+)
""", re.VERBOSE)

在这里,它会寻找整个字符串,因此它也会打印success=

output =>
('rcu_preempt', '7', '120', '', '', '007')
('kworker/u16:2', '73', '120', '', '', '006')
('kworker/u16:4', '364', '120', '', '', '005')
('adbd', '11108', '120', 'success=1', '1', '001')
('kworker/1:1', '16625', '120', 'success=1', '1', '001')
('rcu_preempt', '7', '120', 'success=1', '1', '002')

现在我们需要找出一种方法来删除"success=" 这似乎并不困难。

[编辑]
(?:\\ssuccess=)?(?P<success>\\d)? 效果很好。
通过RomanPerekhrest

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM