Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用正则表达式(RegEx)在特定模式之间提取文本?_Regex_Python 3.x_Text Extraction_Regex Greedy - Fatal编程技术网

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

如何使用正则表达式(RegEx)在特定模式之间提取文本?,regex,python-3.x,text-extraction,regex-greedy,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 .. 在这里,我无法提取多行文

我的文本:

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)
在这里,我无法提取有超链接的全文。也就是说,我只能得到“https”。它将符号“:”视为端点


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

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


您可以使用以下模式:

user_b: (.*?)(?=^[0-9]{2}/[0-9]{2}/[0-9]{2})
正则表达式演示

注意
re.MULTILINE
re.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))
重新导入
数据=“”
2018年7月27日下午12:02-用户_a:https://www.youtube.com/
看这个
2018年7月27日下午12:15-用户:
2018年7月27日下午12:52-用户_b:请仔细阅读
一些文本
一些文本
.
一些文本
2018年7月27日下午12:56-用户:文本。。
'''
usern='user_b'
pattern=re.compile(r”“+usern+r):(*?)(=^[0-9]{2}/[0-9]{2}/[0-9]{2})”,re.DOTALL | re.MULTILINE)
打印(关于findall(图案、数据))
印刷品:

['<Media omitted>\n', 'Read this fully\nsome text\nsome text\n.\nsome text\n']
['\n',请完整阅读\n一些文本\n一些文本\n。\n一些文本\n']

尝试类似的操作(将
\w*
替换为
名称
)。如果要匹配的字符串开头有一个数字,则该操作将失败。很好!然后我倾向于匹配日期/时间,而不仅仅是数字,但由于它是用户输入的,所以可以匹配,谁知道他们将输入什么!如果日志记录可以添加一系列字符或查找一些用户输入的可能性很低的内容,我仍然会这样做。是的,需要对确切的日/月/年模式进行前瞻。如果客户端以相同的日期/时间格式开始一行,您对我的评论是否会有相同的问题?:-)我认为为了使它更可靠,日志记录需要包含一个字符串,该字符串不太可能被输入,并且可以匹配(但是如果它是一个没有输入验证的字段,那么用户输入神奇字符串只是时间问题)。是的,这是正确的。当我回到家时,我会修改前瞻性,使其更具限制性,比如
(?=^[0-9]{2}/[0-9]{2}/[0-9]{2}:[0-9]{2}[0-9]{2}[AP]M-user)
当我意识到这个问题时,我正在用同样的模式更新我的代码。如果使用
(?=[0-9]{2}/[0-9]{2}/[0-9]{2}[0-9]{2}[AP]M-user},会有什么问题
?我没有包括文本“user”,因为我怀疑这只是一个示例,真实的用户id与该模式不匹配。但谁知道呢。海报很少提供正确回答问题所需的所有信息,因此我们会根据所提供的信息进行工作:-/
['<Media omitted>\n', 'Read this fully\nsome text\nsome text\n.\nsome text\n']