- 已关闭**。此问题需要details or clarity。当前不接受答案。
- 想要改进此问题?**添加详细信息并通过editing this post阐明问题。
2天前关闭。
Improve this question
import re
input_text = "((PL_ADVB)alrededor (NOUN)(del auto rojizo, algo grande y completamente veloz)). Luego dentro del baúl rápidamente abajo de una caja por sobre ello vimos una caña." #example input
#place_reference = r"((?i:\w\s*)+)?"
#place_reference = r"(?i:[\w,;.]\s*)+" <--- greedy regex
place_reference = r"(?i:[\w,;.]\s*)+?"
list_all_adverbs_of_place = ["adentro", "dentro", "al rededor", "alrededor", "abajo", "hacía", "hacia", "por sobre", "sobre"]
list_limiting_elements = list_all_adverbs_of_place + ["vimos", "hemos visto", "encontramos", "hemos encontrado", "rápidamente", "rapidamente", "intensamente", "durante", "luego", "ahora", ".", ":", ";", ",", "(", ")", "[", "]", "¿", "?", "¡", "!", "&", "="]
pattern = re.compile(rf"(?:(?<=\s)|^)({'|'.join(re.escape(x) for x in list_all_adverbs_of_place)})?(\s+{place_reference})\s*({'|'.join(re.escape(x) for x in list_limiting_elements)})", flags = re.IGNORECASE)
input_text = re.sub(pattern,
#lambda m: f"((PL_ADVB){m[1]}{m[2]}){m[3]}",
lambda m: f"((PL_ADVB){m[1]}{m[2]}){m[3]}" if m[2] else f"((PL_ADVB){m[1]} NO_DATA){m[3]}",
input_text)
print(repr(input_text)) #--> output
当我使用lambda m: f"((PL_ADVB){m[1]}{m[2]}){m[3]}" if m[2] else f"((PL_ADVB){m[1]} NO_DATA){m[3]}"
时,我得到了以下错误的输出:'((PL_ADVB)alrededor (NOUN)(del auto rojizo, algo grande y completamente veloz)). Luego ((PL_ADVB)dentro del baúl rápidamente abajo de una caja por sobre ello vimos una caña).'
可以注意到捕获组{m[3]}
如何仅捕获.
这并不完全正确,因为您不应该将所有内容都放在括号内,以便获得以下正确的输出:
"((PL_ADVB)alrededor ((NOUN)del auto rojizo, algo grande y completamente veloz)). Luego ((PL_ADVB)dentro del baúl) rápidamente ((PL_ADVB)abajo de una caja) ((PL_ADVB)por sobre ello) vimos una caña."
list_all_adverbs_of_place
表示捕获组的开始,list_limiting_elements
表示捕获组的结束。
1条答案
按热度按时间nue99wik1#
如果我理解你的问题是正确的,问题是文本"por sobre ello"没有突出显示的正则表达式。
正则表达式尝试从第一个列表中查找一个单词,然后是我们感兴趣的单词,最后是第三个列表中的单词。
如果我们运行您的示例,下面是它对给定文本所做的匹配:
这显示了结果:
运行上面的代码将得到以下输出
但是,"sobre ello vimos"并没有像你想要的那样被括号包围。
如果我们获取这个输出并再次输入它,正则表达式现在匹配并看到这一点。
一个三个三个一个
问题是"sobre"是前一个匹配中的单词,这导致它被遗漏。这可以通过在前瞻Assert中指定第三个单词来修复。
你可以把第三个单词正则表达式
(third|list|of|words)
并将其 Package 在
(?=...)
语句中。(?=(third|list|of|words))
因此,最终的正则表达式为: