【问题标题】:Pattern for re not retriving any results不返回任何结果的模式
【发布时间】:2021-11-02 17:01:36
【问题描述】:

我正在尝试在 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}$'?

标签: python python-re


【解决方案1】:

您的问题中的正则表达式是否有错字? *{36} 在括号 ] 之后关闭字符组会导致 error: multiple repeat。你是说r'^[a-zA-Z0-9~@#$^*()_+=[\]{}|\\,.?: -]{36}$'吗?

修复该问题后,您不会得到任何结果,因为 ^ 将匹配锚定到行首,而 $ 锚定到行尾,因此只有当该模式单独出现在单个行。

移除这些锚点,我们得到 lots 个匹配项,因为它匹配 任何 个 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()。

【讨论】:

  • 非常有帮助!基于破折号的正则表达式让我得到了我正在寻找的东西,一个后续问题是如果我想要获得 prettyId 字段我应该如何尝试完成这个?我的想法是它应该是带有 : 的单词 prettyId,然后是引号中带有通配符的一组 ''。但不是 100% 确定如何写。
  • @SkylerMartin 你说得对!根据引号中允许的内容,您可能需要.*,或[^']*,或[a-z0-9]*,或其他内容。顺便说一句,您可以在regex101.com (example) 和here's 上在线尝试正则表达式,这是一个不错的教程。
  • Pranav Gisangadi 这是一个很棒的工具,它让我非常接近 [prettyId: 'a-z0-9'] 但结果又带回了一堆其他的东西,有什么办法吗我可以更具体一点吗?
  • 我想我实际上更接近了这就是我所拥有的 r2 = re.findall(r"\bprettyId: '.*'",text) 尽管我做了什么,但这并没有返回任何结果错了吗?
  • @SkylerMartin 你的作品对我来说很好:我得到["prettyId: 'super'", "prettyId: 'zap'"]。您确定您没有犯我在回答中注释 #1 中指出的错误吗?
猜你喜欢
  • 1970-01-01
  • 2017-12-28
  • 2017-12-09
  • 2020-10-03
  • 2017-03-19
  • 2017-05-20
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多