python - 不检索任何结果的模式
问题描述
我正在尝试在 python 中创建一个 re 模式来提取这种文本模式。
contentId:'2301ae56-3b9c-4653-963b-2ad84d06ba08' contentId:'a887526b-ff19-4409-91ff-e1679e418922'
内容 ID 的长度为 36 个字符,混合了小写字母和数字,并在位置 8、13、18、23、36 处包含破折号。
对此的任何帮助将不胜感激,因为我现在似乎无法获得结果。
r1 = re.findall(r'^[a-zA-Z0-9~@#$^*()_+=[\]{}|\\,.?: -]*{36}$',f.read())
print(r1)
下面是我试图从中提取的文件
Object.defineProperty(e, '__esModule', { value: !0 }), e.default = void 0;
var t = r(d[0])(r(d[1])), n = r(d[0])(r(d[2])), o = r(d[0])(r(d[3])), c = r(d[0])(r(d[4])), l = r(d[0])(r(d[5])), u = function (t) {
return [
{
contentId: '2301ae56-3b9c-4653-963b-2ad84d06ba08',
prettyId: 'super',
style: { height: 0.5 * t }
},
{
contentId: 'a887526b-ff19-4409-91ff-e1679e418922',
prettyId: 'zap',
style: { height: t }
}
];
},
解决方案
您的问题中的正则表达式是否有错字?*{36}
在关闭字符组的括号之后]
会导致error: multiple repeat
. 你的意思是r'^[a-zA-Z0-9~@#$^*()_+=[\]{}|\\,.?: -]{36}$'
?
解决这个问题,你不会得到任何结果,因为^
将匹配锚定到行首和$
行尾,所以只有当这个模式单独出现在一行时,你才会得到结果。
移除这些锚点,我们得到了很多匹配,因为它匹配任何36 长的字符串:
r1 = re.findall(r'[a-zA-Z0-9~@#$^*()_+=[\]{}|\\,.?: -]{36}',t)
r1: ['var t = r(d[0])(r(d[1])), n = r(d[0]',
')(r(d[2])), o = r(d[0])(r(d[3])), c ',
'= r(d[0])(r(d[4])), l = r(d[0])(r(d[',
'2301ae56-3b9c-4653-963b-2ad84d06ba08',
' style: { height: 0.5',
'a887526b-ff19-4409-91ff-e1679e418922',
' style: { height: t }']
要仅匹配您的 ID,请仅查找字母数字字符或破折号。
r1 = re.findall(r'[a-zA-Z0-9\-]{36}',t)
r1: ['2301ae56-3b9c-4653-963b-2ad84d06ba08',
'a887526b-ff19-4409-91ff-e1679e418922']
为了使其更加具体,您可以指定破折号的位置:
r1 = re.findall(r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}', t, re.IGNORECASE)
r1: ['2301ae56-3b9c-4653-963b-2ad84d06ba08',
'a887526b-ff19-4409-91ff-e1679e418922']
指定re.IGNORECASE
标志消除了查找大写和小写字符的需要。
笔记:
如果您要多次使用其内容,您应该将文件读入一个变量并使用该变量,因为
f.read()
在第一次之后不会给出任何内容,.read()
除非您f.seek(0)
为了避免在磁盘上创建包含这些内容的新文件,我刚刚定义了
t = """Object.defineProperty(e, '__esModule', { value: !0 }), e.default = void 0;
var t = r(d[0])(r(d[1])), n = r(d[0])(r(d[2])), o = r(d[0])(r(d[3])), c = r(d[0])(r(d[4])), l = r(d[0])(r(d[5])), u = function (t) {
return [
{
contentId: '2301ae56-3b9c-4653-963b-2ad84d06ba08',
prettyId: 'super',
style: { height: 0.5 * t }
},
{
contentId: 'a887526b-ff19-4409-91ff-e1679e418922',
prettyId: 'zap',
style: { height: t }
}
];
},"""
并用于t
代替f.read()
您的问题。
推荐阅读
- flutter - 如何在flutter中访问REST API的JSON数组的复杂内部元素
- c# - 是否可以将 C# 9 用于 Xamarin?
- python - 为什么这个切片不返回前 3 个元素?
- flutter - Flutter - 如何将元素移动到列表的末尾?
- string - Powershell:从txt中提取几个字符串并从中创建表
- wordpress - 如果购物车中存在两种不同的运输类别,则仅显示 1 个特定的运输类别
- php - Codeigniter 3 - do_upload 中无法识别文件
- angular - owl-date-time 和 http 角度同步
- objective-c - 未定义符号:_OBJC_CLASS_$_FIRApp
- prolog - 扩展统一,SICStus 风格