首页 > 解决方案 > 不检索任何结果的模式

问题描述

我正在尝试在 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 }
            }
        ];
    },

标签: pythonre

解决方案


您的问题中的正则表达式是否有错字?*{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标志消除了查找大写和小写字符的需要。


笔记:

  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()您的问题。


推荐阅读