[英]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
,以確保y
在hay
和類似問題中不匹配。
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.