我有这样一行:
[24 Mar 2019] ABC-000 somestring-with-numbers-and-dashes - a whole bunch of text
正则表达式是这样:
re_header = re.compile(r'^\[(\d\d) ([A-Z][a-z][a-z]) (\d{4})\] '
+ r'(ABC-\d+(?:-\d+)?)\s+'
+ r'(.*?)\s*$')
现在我能得到的是:
('24', 'Mar', '2019', 'ABC-000', 'somestring-with-numbers-and-dashes - a whole bunch of text')
我想要的是一个由“数字和破折号组成的字符串”组成的附加组,如下所示:
('24', 'Mar', '2019', 'ABC-000', 'somestring-with-numbers-and-dashes')
'somestring-with-numbers-and-dashes'
之后的所有内容都应忽略。
我该如何实现?
答案 0 :(得分:2)
您可以使用
^\[(\d{2}) ([A-Z][a-z]{2}) (\d{4})\]\s*(DSA-\d+(?:-\d+)?)\s+([^\s-]+(?:-[^\s-]+)*)
请参见regex demo(由于您的模式包含DSA
而不是ABC
,因此我在模式和regex101的演示字符串中使用了DSA
)。
您感兴趣的部分是([^\s-]+(?:-[^\s-]+)*)
:
[^\s-]+
-除空格和-
之外的1个以上的字符(?:-[^\s-]+)*
--
的0或多个重复,后跟除空格和-
之外的任意1个以上的字符。答案 1 :(得分:1)
只需将最终的(.*?)\s*$
更改为([^\s]*)
:
re_header = re.compile(r'^\[(\d\d) ([A-Z][a-z][a-z]) (\d{4})\] '
+ r'(ABC-\d+(?:-\d+)?)\s+'
+ r'(\S*)')
请注意,我必须将原始表达式中的DSA
更改为ABC
,以使其起作用。
答案 2 :(得分:1)
您可以将最后一个正则表达式部分简单地替换为
(.*?) - .*$
因此,您会捕获到尽可能少的文本,直到-
出现为止。
答案 3 :(得分:1)
如果日期仅包含1位数字并且月份超过3个字符,则正则表达式中的其他问题,例如。 2019年6月9日。此外,您在正则表达式中使用DSA
,但在输出中如何使用ABC
?因此,为了适应这些情况,最好使用以下regex:
^\[(\d+) ([A-Za-z]+) (\d{4})\] ([A-Z]+-\d+(?:-\d+)?)\s+(\S*)