解决python正则表达式出现:sre_constants.error: multiple repeat at position 3

一,问题出现:

这是在Python IDLE 中运行出现的情况:

>>> pattern = '(.?*)(\d+)'
>>> s = '第1章 绪论  1'
>>> re.findall(pattern, s)
Traceback (most recent call last):
  File "/usr/lib/python3.6/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "/usr/lib/python3.6/re.py", line 222, in findall
    return _compile(pattern, flags).findall(string)
  File "/usr/lib/python3.6/re.py", line 301, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.6/sre_compile.py", line 562, in compile
    p = sre_parse.parse(p, flags)
  File "/usr/lib/python3.6/sre_parse.py", line 855, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "/usr/lib/python3.6/sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "/usr/lib/python3.6/sre_parse.py", line 765, in _parse
    p = _parse_sub(source, state, sub_verbose, nested + 1)
  File "/usr/lib/python3.6/sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "/usr/lib/python3.6/sre_parse.py", line 619, in _parse
    source.tell() - here + len(this))
sre_constants.error: multiple repeat at position 3
>>> pattern = '.?*(\d+)'
>>> re.findall(pattern, s)
Traceback (most recent call last):
  File "/usr/lib/python3.6/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "/usr/lib/python3.6/re.py", line 222, in findall
    return _compile(pattern, flags).findall(string)
  File "/usr/lib/python3.6/re.py", line 301, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.6/sre_compile.py", line 562, in compile
    p = sre_parse.parse(p, flags)
  File "/usr/lib/python3.6/sre_parse.py", line 855, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "/usr/lib/python3.6/sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "/usr/lib/python3.6/sre_parse.py", line 619, in _parse
    source.tell() - here + len(this))
sre_constants.error: multiple repeat at position 2

问题出在正则的写法存在问题,因此去掉?或者*均可,具体看你要匹配的对象。

二,解决问题

>>> pattern = '(.*)(\d+)'
>>> re.findall(pattern, s)
[('第1章 绪论  ', '1')]
>>> regex = re.compile(r'(.*)(\d+)')
>>> result = regex.search(s)
>>> result.group()
'第1章 绪论  1'
>>> result.group(1)
'第1章 绪论  '
>>> result.group(2)
'1'

.*是贪婪匹配,.*?是非贪婪匹配。

`AttributeError: &#39;_sre.SRE_Pattern&#39; object has no attribute &#39;str&#39;` 这个错误通常发生在尝试访问 `_sre.SRE_Pattern` 类的一个不存在的属性 `str` 的时候。这个错误常出现在 Python 中处理正则表达式时。 在Python中,`_sre.SRE_Pattern` 对象代表了正则表达式的匹配结果或正则表达式本身。它是一个底层的数据结构,用于存储由 `re.compile()` 函数生成的正则表达式信息。当你尝试对这种类型的对象使用像 `str()` 这样的方法,期望将其转换为字符串,但是该方法实际上并不存在于 `_sre.SRE_Pattern` 类上,所以就会抛出上述错误。 这可能是由于几个原因造成的: 1. **误用了对象**:你可能意外地将一个 `_sre.SRE_Pattern` 类型的对象作为另一个需要某种特定方法的对象使用了。例如,如果你希望获取某个匹配的结果字符串,并尝试使用 `.str` 属性而非正确的 `.group()`, `.groups()` 或 `.string` 等方法。 2. **使用了过时的函数或库版本**:如果使用的正则表达式库有更新,某些旧版本可能允许你这样做而新版本不允许。 ### 解决方案 为了修复这个问题,你可以尝试以下步骤: 1. **检查代码上下文**:确认你是否正确地处理了正则表达式的匹配结果。如果你是在试图提取匹配到的内容,请使用适当的 SRE_Pattern 的方法如 `.group(0)`、`.groups()` 或者 `.string`,取决于你需要的是整个匹配内容、捕获组还是原始输入文本。 2. **修改代码逻辑**:如果在匹配之后确实需要操作这个模式本身而不是其匹配结果,确保你正在适当的方式下操作这个模式对象,即通过调用其方法来实现预期的操作,例如 `pattern.pattern` 可能返回模式的字符串形式。 3. **更新库**:如果使用的是第三方正则表达式处理库(比如 `pcre-python`, `regex` 等),考虑更新至最新版本,因为库的开发者可能已经在版本迭代过程中修正了一些潜在的问题。 4. **查阅文档**:查阅相关库的官方文档或源码,了解每个类及其方法的实际功能和用法限制。 ```python import re # 示例代码 text = "Hello World" pattern = re.compile(r"World") # 编译正则表达式 match_result = pattern.search(text) # 执行搜索 if match_result: print("Matched text:", match_result.group(0)) # 使用 .group() 获取匹配的文本 else: print("No match found") ``` ### 相关问题: 1. 当遇到 `AttributeError` 错误时,如何确定错误发生的具体位置和原因? 2. 怎样避免在正则表达式应用中引发此类错误? 3.Python 的其他场景中,常见的 `AttributeError` 是如何产生的?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值