如何使用正则表达式(RegEx)在某些模式之间提取文本?

时间:2018-08-31 14:15:55

标签: regex python-3.x text-extraction regex-greedy

我的文字:

27/07/18, 12:02 PM - user_a: https://www.youtube.com/
 Watch this
27/07/18, 12:15 PM - user_b: <Media omitted>
27/07/18, 12:52 PM - user_b: Read this fully
some text
some text
.
some text
27/07/18, 12:56 PM - user_c: text ..

在这里,我想提取用户发送的消息。我尝试了两个正则表达式。但是我没有得到想要的答案

第一个正则表达式:

re.findall(r''+user_name+ ':(.*)', data)

在这里我无法提取多行文本

第二个正则表达式:

re.findall(r''+ user_name + ':[^(:)]*', data)

在这里,我无法提取具有超级链接的全文。即,我只能获得“ https”。它将符号“:”作为端点。

我该如何处理?任何类型的建议都是非常有用的

2 个答案:

答案 0 :(得分:1)

我相信您的正则表达式应为:user_b: (.*?)^[0-9]。找到您的用户后,匹配该行的其余部分,直到找到一个数字作为该行的第一个字符(下一个条目)。确保打开多行。

See a demo here.

答案 1 :(得分:1)

您可以使用以下模式:

user_b: (.*?)(?=^[0-9]{2}/[0-9]{2}/[0-9]{2})

正则表达式演示here

请注意re.MULTILINEre.DOTALL的用法。需要第一个标志来匹配多行文本上的行模式开头,而需要re.DOTALL来使.也能够匹配换行符。


在Python中:

import re
data = '''
27/07/18, 12:02 PM - user_a: https://www.youtube.com/
 Watch this
27/07/18, 12:15 PM - user_b: <Media omitted>
27/07/18, 12:52 PM - user_b: Read this fully
some text
some text
.
some text
27/07/18, 12:56 PM - user_c: text ..
'''
usern = 'user_b'

pattern = re.compile(r""+usern+r": (.*?)(?=^[0-9]{2}/[0-9]{2}/[0-9]{2})",re.DOTALL|re.MULTILINE)
print(re.findall(pattern,data))

打印:

['<Media omitted>\n', 'Read this fully\nsome text\nsome text\n.\nsome text\n']