簡體   English   中英

設置正則表達式模式以識別枚舉的重復模式,其中相同的匹配重復未知次數的連續次數

[英]Set a regex pattern to identify a repeating pattern of an enumeration, where the same match is repeated an unknown number of successive times

import re

input_text = "hjshhshs el principal, amplio, de gran importancia, y más costoso hotel de la zona costera. Es una sobrilla roja, bastante amplia y incluso cómoda de llevar. Hay autos rápidos, más costosos, y veloces. también, hay otro tipo de autos menos costosos"

direct_subject_modifiers = r"((?:\w+))"
modifier_connectors = r"(?:(?:,\s*|)y|(?:,\s*|)y|,)\s*(?:(?:(?:a[úu]n|todav[íi]a|incluso)\s+|)(?:de\s*gran|bastante|un\s*tanto|un\s*poco|)\s*(?:m[áa]s|menos)\s+|)"

regex = modifier_connectors + direct_subject_modifiers

matches = re.finditer(regex, input_text, re.MULTILINE | re.IGNORECASE)

input_text = re.sub(matches, lambda m: (f"\(\(DESCRIP\){m[1]}\)"), input_text, re.IGNORECASE)
print(repr(input_text))

如何構建正則表達式來檢測在這兩種模式中重合的 n 個元素的連續描述regex = modifier_connectors + direct_subject_modifiers ,重復自己的次數未知?

output 在識別字符串中的元素並將它們放在括號中之后,請記住在同一個字符串中可以有多個模式必須封裝在括號之間,在這個例子中有 3 個。

"hjshhshs el ((DESCRIP)principal, amplio, de gran importancia, y más costoso) hotel de la zona costera. Es una sobrilla ((DESCRIP)roja, bastante amplia y incluso cómoda) de llevar. Hay autos ((DESCRIP)Hay autos rápidos, más costosos, y veloces). también, hay otro tipo de autos menos costosos"

首先是正則表達式和代碼的一些問題:

  • 由於第一個正則表達式不匹配空格,第二個正則表達式應該允許它匹配的單詞前后有空格。 這並沒有始終如一地完成(例如,在“de gran”之后沒有匹配的空間)。

  • 由於您的文本包含重音字母,因此您需要應用re.UNICODE修飾符,因此\w也會匹配這些字母。

  • 為避免誤報,您最好在正則表達式中也添加一些\b ,以確保yhay和類似問題中不匹配。

  • re.sub期望一個正則表達式作為第一個參數,而不是來自re.finditer的匹配項

  • re.sub期望標志作為第 5參數,而不是第 4

  • m[1]只會重現第一個捕獲組匹配的內容,而您需要在此處重現所有匹配的文本。 這將是m[0] ,但請參閱下面的評論。

沒問題,但是有一個? 您可以使用的運算符。 它可以用來代替用( |)添加空的替代品。

不需要re.sub回調。 您可以提供一個字符串文字作為第二個參數,並使用\g<0>重現匹配的字符串。

至於主要問題:您可以使用{2,}量詞將模式重復至少兩次。

這是我最終得到的代碼:

import re

input_text = "hjshhshs el principal, amplio, de gran importancia, y más costoso hotel de la zona costera. Es una sobrilla roja, bastante amplia y incluso cómoda de llevar. Hay autos rápidos, más costosos, y veloces. también, hay otro tipo de autos menos costosos"

direct_subject_modifiers = r"((?:\w+))"
# always match prefix and postfix spaces
modifier_connectors = r"\s*(?:\by\s+|,\s*(?:y\s+)?)\b(?:(?:a[úu]n|todav[íi]a|incluso)?(?:de\s*gran|m[áa]s|menosde\s*gran|bastante|(?:un\s*tanto|un\s*poco)?\s*(?:m[áa]s|menos))?)\b\s*"  

regex = direct_subject_modifiers + "(?:" + modifier_connectors  + direct_subject_modifiers + "){2,}"

"""
Added Unicode mode, to match accented letters too
First arg should be the regex. 
No need for callback argument. Just back reference with g<0>
No need to escape parentheses in the replacement string
"""

input_text = re.sub(regex, r"((DESCRIP)\g<0>)", input_text, flags=re.I | re.U)
print(repr(input_text))

Output:

'hjshhshs el ((DESCRIP)principal, amplio, de gran importancia, y más costoso) hotel de la zona costera。 Es una sobrilla ((DESCRIP)roja, bastante amplia y incluso cómoda) de llevar。 Hay autos ((DESCRIP)rápidos, más costosos, y veloces)。 también, hay otro tipo de autos menos costosos'

最后一點:語言語法太復雜,無法用正則表達式解析。 您總是會遇到基於正則表達式的解決方案不足的示例……並且代碼將變得難以維護。 標記輸入然后通過代碼應用規則將更易於管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM