不检索任何结果的模式

Pattern for re not retriving any results

我正在尝试在 python 中创建一个重新模式来提取这种文本模式。

contentId: '2301ae56-3b9c-4653-963b-2ad84d06ba08' 内容编号:'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}$' 吗?

解决这个问题,你得不到任何结果,因为 ^ 将匹配锚定到行的开头,而 $ 锚定到行的末尾,所以你只会得到结果如果这模式单独在一条线上。

删除这些锚点,我们得到 lots 个匹配项,因为它匹配 any 个 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 标志可以消除同时查找大写和小写字符的需要。


注:

  1. 如果要多次使用其内容,则应将文件读入变量并使用该变量,因为 f.read() 在第一个 .read()除非你f.seek(0)

  2. 为了避免使用这些内容在磁盘上创建新文件,我刚刚定义了

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()