python - 正则表达式输出有我无法理解的空字符串
问题描述
我对正则表达式有点陌生,我的输出列表中有一些我无法理解的空字符串。我有以下字符串:
string ='[-1, <samp>clear</samp>, -1, None, -1] [-1, None, -1, None, -1, <time class="text-nowrap" datetime="2021-03-22T17:06:03.000Z" id="availability-time"></time>, -1, None, -1'
我正在尝试提取<samp> tags (which is "clear")
日期和日期之间的单词2021-03-22T17:06:03.000Z
。尽管我的模式似乎运行良好,但当我将它们与逻辑运算符或 (|) 组合在一起时,输出列表中会出现空字符串。
例子:
import re
pattern = '\>([a-zA-Z]+)\<'
pattern2= '(\d{4}-\d{2}-\d{2}[a-zA-Z][\d:\.[a-zA-Z]+)'
string = '[-1, <samp>clear</samp>, -1, None, -1] [-1, None, -1, None, -1, <time class="text-nowrap" datetime="2021-03-22T17:06:03.000Z" id="availability-time"></time>, -1, None, -1'
print(re.findall(pattern,string))
print(re.findall(pattern2,string))
输出
['clear']
['2021-03-22T17:06:03.000Z']
现在,当我与 with 结合pattern
时pattern2
,|
我得到以下结果:
import re
pattern = '\>([a-zA-Z]+)\<|(\d{4}-\d{2}-\d{2}[a-zA-Z][\d:\.[a-zA-Z]+)'
string = '[-1, <samp>clear</samp>, -1, None, -1] [-1, None, -1, None, -1, <time class="text-nowrap" datetime="2021-03-22T17:06:03.000Z" id="availability-time"></time>, -1, None, -1'
print(re.findall(pattern,string))
输出
[('clear', ''), ('', '2021-03-22T17:06:03.000Z')]
这些空字符串从何而来?请帮忙!
解决方案
您观察到的输出只是re.findall
您定义捕获组时的预期行为。在这种情况下,每个元组中的第一个条目是第一个捕获组(来自<samp>
模式的一部分),而第二个条目是第二个捕获组(来自时间戳)。您的交替将仅匹配这两个捕获组之一,因此输出将始终是带有一个空字符串的 2 元组。
一种可能的解决方法是完全避免捕获组:
pattern = '(?<=>)[a-zA-Z]+(?=<)|\d{4}-\d{2}-\d{2}[a-zA-Z][\d:\.[a-zA-Z]+'
string = '[-1, <samp>clear</samp>, -1, None, -1] [-1, None, -1, None, -1, <time class="text-nowrap" datetime="2021-03-22T17:06:03.000Z" id="availability-time"></time>, -1, None, -1'
print(re.findall(pattern,string)) # ['clear', '2021-03-22T17:06:03.000Z']
通过对模式部分进行轻微更改<samp>
以使用环视,我们可以避免捕获组。然后,每个匹配re.findall
项都将是列表中的一个条目。
推荐阅读
- java - Spring boot 如何正确使用@PostConstruct
- android - 如何在flutter中从其他android型号中检测华为设备型号?
- angular - Angular FormBuilder补丁值在编辑后丢失了补丁值
- kotlin - VSCode 不知道 Gradle 项目的依赖关系
- python - 即使字典中的键是键错误?
- powershell - Powershell添加错误字符进行注册
- c#-4.0 - 嵌套列表上的 C# Automapper
- javascript - 重新提交表单时如何防止表单提交时创建的div消失
- javascript - firebase.messaging.getToken() 给出 DOMException:注册失败 - 推送服务错误
- swift - 发送与 webview 具有相同会话 ID 的 urlrequest