Skip to main content
 首页 » 编程设计

python之在python中使用正则表达式匹配任何字符和/或未定义的换行符

2024年09月03日27qq号

我必须在 python 中使用正则表达式解析日志 txt 文件。这是一个 txt 示例(名为 file):

20/01/18, 08:11 - Peter: Good morning

How are you?

Peter 20/01/18, 09:00 - Caroline: I am fine thanks. You?

20/01/18, 09:01 - Peter: Good

I had some problems few days ago.

Now I am happy

Are you working?

20/01/18, 09:02 - Caroline: No I have to go to the supermarket to buy vegetables

20/01/18, 09:12 - Peter: Nice!

Where are you now?

我试图用这个正则表达式解析整个文本:

f = open(file, 'r', encoding='utf-8') 
texts=re.findall('(\d+/\d+/\d+, \d+:\d+\d+) - (.+?): (.*)',f.read()) 
f.close() 
 
df= pd.DataFrame(texts,columns=['data','name','text']) 

但是,我在 python 中匹配一个或多个换行符时遇到问题(例如 Peter 在 09:01 的文本)。我也尝试着手 https://regex101.com/寻找可能的解决方案,但我没有成功。

你能帮帮我吗?

请您参考如下方法:

如果您想匹配以下文本直到新行开头的下一个日期,您可以使用否定先行匹配所有不以类似日期模式开始的行:

(\d+/\d+/\d+, \d+:\d+\d+) - (.+?): (.*(?:\r?\n(?!\d+/\d+/\d).*)*) 

关于最后一部分 (.*(?:\r?\n(?!\d+/\d+/\d).*)*)

  • ( 捕获组 3
    • .* 匹配除换行符之外的任何字符 0 次以上
    • (?: 非捕获组
      • \r?\n 匹配新行
      • (?!\d+/\d+/\d).* 断言右边的不是类似日期的格式
    • )* 关闭非捕获组并重复0+次
  • )关闭群组

Regex demo