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

问题描述 投票:4回答:2

我的文字:

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”。它将符号“:”视为端点。

我该如何处理?任何形式的建议都非常棒,乐于助人

regex python-3.x text-extraction regex-greedy
2个回答
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']

1
投票

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

See a demo here.

© www.soinside.com 2019 - 2024. All rights reserved.