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

How to extract text between certain patterns using regular expression (RegEx)?

我的文字:

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)

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

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

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

See a demo here.

您可以使用以下模式:

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']