正则表达式分组直到空间

时间:2019-03-25 12:47:46

标签: python regex

我有这样一行:

[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'之后的所有内容都应忽略。

我该如何实现?

4 个答案:

答案 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*)')

Demo

请注意,我必须将原始表达式中的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*)