Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

376
Views
Eliminar guiones bajos entre caracteres japoneses de una cadena en python

Necesito ayuda para eliminar guiones bajos de ciertas cadenas. Eso no es difícil, la dificultad proviene del hecho de que la cadena contiene caracteres japoneses.

Por ejemplo, tengo estas cadenas (de cientos de miles de otras cadenas):

 str1 = "3F_う_が_LOW_まい_が" str2 = "A5_BB_合_ら" str3 = "C1_だ_と_思"

Lo que quiero obtener como resultado final es este:

 strFinal1 = "3F_うが_LOW_まいが" strFinal2 = "A5_BB_合ら" strFinal3 = "C1_だと思

Básicamente, quiero eliminar el guión bajo solo entre dos caracteres japoneses. ¿Cómo puedo hacer esto en Python?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

No estoy familiarizado con los diferentes conjuntos de caracteres japoneses, pero debería poder identificar los caracteres japoneses en función de sus puntos de código Unicode, que deberían estar dentro de uno de los siguientes rangos:

  • Hiraganá: 3040-309f
  • Katakana: 30a0-30ff
  • Kanji: 4e00-9fbf

Tenga en cuenta que diferentes fuentes también pueden incluir otros rangos, como 1 o 2 . Los que enumeré definitivamente deben incluirse, pero debe averiguar qué otros rangos también desea cubrir y luego extender la función is_japanese_char que se muestra a continuación.

 import re def is_japanese_char(ch): assert(len(ch) == 1) # only use this for single character strings if re.search("[\u3040-\u309f]", ch): return True # is hiragana if re.search("[\u30a0-\u30ff]", ch): return True # is katakana if re.search("[\u4e00-\u9faf]", ch): return True # is kanji return False

Ahora que puede identificar los caracteres japoneses, puede iterar sobre cada carácter de la cadena y eliminar todos los caracteres no deseados, como este:

 def is_bad_underscore(ch, prev_ch, next_ch): if ch != "_": return False if not is_japanese_char(prev_ch): return False if not is_japanese_char(next_ch): return False return True def remove_bad_underscores(s): new_string = s[0] for i, ch in enumerate(s[1:-1], start=1): # skip first and last if not is_bad_underscore(ch, s[i-1], s[i+1]): new_string += ch return new_string + s[-1]

No es el código más limpio y se puede optimizar, pero funciona.

 print(remove_bad_underscores("3F_う_が_LOW_まい_が") == "3F_うが_LOW_まいが") # True print(remove_bad_underscores("A5_BB_合_ら") == "A5_BB_合ら") # True print(remove_bad_underscores("C1_だ_と_思") == "C1_だと思") # True
over 4 years ago · Santiago Trujillo Report

0

Para complementar un poco la respuesta de Alan Verresen : para un código un poco más legible por humanos, puede:

  • use el módulo regex en lugar del módulo re
  • use propiedades de categoría de script Unicode en lugar de especificar explícitamente rangos de puntos de código
 import regex def is_japanese_char(ch): assert(len(ch) == 1) # only use this for single character strings if regex.search("\p{Hiragana}", ch): return True # is hiragana if regex.search("\p{Katakana}", ch): return True # is katakana if regex.search("\p{Han}", ch): return True # is kanji return False

El módulo regex admite esa sintaxis \p{} pero el módulo re todavía no, que yo sepa. Para obtener más información sobre cómo hacer coincidir otras categorías de propiedades Unicode, consulte también las respuestas en:

  • ¿Cómo averiguar el carácter chino o japonés en una cadena en Python?
  • Python regex que coincide con las propiedades Unicode
  • ¿Coincide con alguna letra unicode?
  • ¿Cómo hago coincidir todos los caracteres en minúsculas Unicode en Python con una expresión regular?
  • Python: ¿validación básica de nombres internacionales?
over 4 years ago · Santiago Trujillo Report

0

Debe verificar la función incorporada ord :

 >>> ord('a') 97 >>> ord('が') 12364

Como puede notar, un carácter japonés tiene un número mucho más alto cuando se pasa como argumento a ord , por lo que puede usar esta diferencia de esta manera:

 # Where i is the index of an _ in the string if (ord(string[i+1]) > 500 and ord(string[i-1]) > 500): # The _ is between two not-european characters

Esto debería funcionar:

 string: str = list(input()) for index, element in enumerate(string): if (index == 0): continue # Where index is the index of an _ in the string if (element == '_'): # The _ is between two not-european characters if (ord(string[index+1]) > 500 and ord(string[index-1]) > 500): string[index] = ' ' string = ''.join(string)
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!