es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuentra todas las ocurrencias del patrón regex, pero ignora las ocurrencias que contengan otro patrón.

Tengo un bloque de texto que intento analizar:

「<%sM_item2><%sM_plusnum2&gt;の| <%sM_slot>の部分を| <%sM_change_color>に カラーリングするのですね?|<br>|「それでは <%sM_item>が 10本と| <%nM_gold>ゴールドが必要ですが よろしいですか?|<yesno><close>

En este bloque de texto, intento dividir el regex en todas las ocurrencias de <???>, excepto cuando coincide en <%???>.

Lo tengo en su mayoría funcionando con esto:

re.split(r'<((?!%).+?)>', source_text)

[‘「<%sM_item2><%sM_plusnum2>の|\u3000<%sM_slot>の部分を|\u3000<%sM_change_color>に\u3000カラーリングするのですね?|’, ‘br’, ‘|「それでは\u3000<%sM_item>が\u300010
本と|\u3000<%nM_gold>ゴールドが必要ですが\u3000よろしいですか?|’, ‘yesno’, ”, ‘close’, ”]

Mi problema es que aunque mantuvo las etiquetas <%???> en su lugar, de alguna manera eliminó los caracteres <> de las coincidencias (observe que las etiquetas ‘yesno’, ‘close’ y ‘br’ ya no tienen esos caracteres).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema de que los caracteres <> se eliminen de las coincidencias, puede utilizar las afirmaciones de anticipación y retroceso para incluirlos como parte de la coincidencia regex, mientras aún se excluyen las etiquetas <% y %>. Aquí está el patrón regex modificado:

    re.split(r'(?<!%)<(?!(%|\w+_))(.*?)(?<!(_|%))>(?!%)', source_text)
    

    Desglose:

    • (?<!%): afirmación de retroceso negativa para excluir las coincidencias que van precedidas por %
    • &lt;: coincide con la etiqueta de apertura &lt;
    • (?!(%|\w+_)): afirmación de anticipación negativa para excluir las coincidencias que van seguidas de %, o una cadena de caracteres de palabra seguida de _
    • (.*?): captura cualquier carácter entre las etiquetas de apertura y cierre, perezosamente
    • (?<!(_|%)): afirmación de retroceso negativa para excluir las coincidencias que van inmediatamente precedidas por _ o %
    • &gt;: coincide con la etiqueta de cierre &gt;
    • (?!%): afirmación de anticipación negativa para excluir las coincidencias que van seguidas de %

    Con esta modificación, la regex debería dividir correctamente el bloque de texto mientras retiene los caracteres &lt;&gt; en las coincidencias:

    ['「<%sM_item2><%sM_plusnum2>の|\u3000<%sM_slot>の部分を|\u3000<%sM_change_color>に\u3000カラーリングするのですね?|', '<br>', '|「それでは\u3000<%sM_item>が\u300010本と|\u3000<%nM_gold>ゴールドが必要ですが\u3000よろしいですか?|', '<yesno>', '<close>']
    

Comments are closed.