首页 > 解决方案 > 如何使用此正则表达式模式提取子字符串?它给出了一个 ValueError: too many values to unpack (expected 1)

问题描述

import re, random, os, datetime, time
from os import remove
from unicodedata import normalize
from glob import glob


def learn_in_real_time(input_text, text):

    #Quita acentos y demas diacríticos excepto la ñ
    input_text = re.sub(
        r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1",
        normalize("NFD", input_text), 0, re.I
    )

    input_text = normalize( 'NFC', input_text) # -> NFC
    input_text_to_check = input_text.lower() #Convierte a minuscula todo

    words = []
    words_associations = []

    regex_what_who = r"(.*)\¿?(que sabes|que sabias|que sabrias|que te referis|que te refieres|que te referias|que te habias referido|que habias referido|a que|que|quienes|quien)\s*(con que|con lo que|con la que|con|acerca de que|acerca de quienes|acerca de quien|sobre de que|sobre que|sobre de quienes|sobre quienes|sobre de quien|sobre quien|)\s*(son|sean|es|serian|seria)\s*(iguales|igual|similares|similar|parecidos|parecido|comparables|comparable|asociables|asociable|distinguibles|distinguible|distintos|distinto|diferentes|diferente|diferenciables|diferenciable|)\s*(a |del |de |)\s*((?:\w+\s*)+)?"

    l = re.search(regex_what_who, input_text_to_check, re.IGNORECASE) #Con esto valido la regex haber si entra o no en el bloque de code

    if l:
        #print("C")
        association, = l.groups()
        association = association.strip()
        association_check = association + "\n" #Uso estas para las comparaciones, ya que sino las consideraria erroneamente como palabras que no estan en la lista solo por no tener el \n


        return text


    return text

我需要它来提取 ((?: \W + \ s *) +) 中的单词并将其作为字符串保存到变量中,但问题是它给了我这个错误:

Traceback (most recent call last):
  File "answer_about_learned_in_txt.py", line 106, in <module>
    print(learn_in_real_time(input_t, text))
  File "answer_about_learned_in_txt.py", line 72, in learn_in_real_time
    association, = l.groups()
ValueError: too many values to unpack (expected 1)

如何提取 ((?: \W + \ s *) +) 中的所有内容,并将其保存在变量中?

现在利用我问我将如何做:

a) 提取 ((?: \W + \ s *) +) 中的所有内容,如果有空格,它不会剪切并保存所有内容,例如:“你好,你好吗?”

b) 提取 ((?: \W + \ s *) +) 中的所有内容,但最多保存第一个空格,例如:“Hello”


我的问题是,如果我输入以下内容,元组的第 6 位就不会抓住我

if l:
        #print("C")
        #association, = l.groups()
        print(l.groups())
        association, _temp = l.group(6)

它给了我这个错误

File "answer_about_learned_in_txt.py", line 74, in learn_in_real_time
    association, _temp = l.group(6)
ValueError: not enough values to unpack (expected 2, got 0)
In the end I was able to solve it with the following

如果你输入

阙子洛斯彗星

print (l.groups ())

('', 'que', '', '儿子', '', '', '洛斯彗星')

我对元组的第七个位置感兴趣,从 1 开始计数

association = l.group (7)

这给了我:

'洛斯彗星'

标签: pythonre

解决方案


让我们将模式字符串更新为逻辑视图并遵循主要功能。

regex_what_who = r"(que sabes|que sabias|que sabrias|que te referis|que te refieres|que te referias|que te habias referido|que habias referido|a que|que|quienes|quien|con que|con lo que|con la que|con|acerca de que|acerca de quienes|acerca de quien|sobre de que|sobre que|sobre de quienes|sobre quienes|sobre de quien|sobre quien|son|sean|es|serian|seria|iguales|igual|similares|similar|parecidos|parecido|comparables|comparable|asociables|asociable|distinguibles|distinguible|distintos|distinto|diferentes|diferente|diferenciables|diferenciable).*(a|del|de)\s*((?:\w+\s*)+)?"  

然后,如果我们得到一个或多个结果,则修复错误第一个错误:

association, _temp = l.groups()    

有用!-) 有用!


推荐阅读