Próbuję użyć REGEX, aby dopasować coś spełnia następujące warunki:

  1. Nie zawieraj ciągów "//"
  2. zawierają chińskie znaki
  3. podnieś te chińskie znaki

Czytam linię według linii z pliku:

f = open("test.js", 'r')
lines = f.readlines()
for line in lines:
    matches = regex.findall(line)
    if matches:
        print(matches)

Najpierw próbowałem dopasować chińskie znaki za pomocą następującego wzoru:

re.compile(r"[\u4e00-\u9fff]+")

Działa i daje mi wyjście:

['下载失成功']
['下载失败']
['绑定监听']
['该功能暂未开放']

Potem próbowałem wykluczyć "//" z następującym wzorem i łączyłem go do powyższego wzoru:

re.compile(r"^(?=^(?:(?!//).)*$)(?=.*[\u4e00-\u9fff]+).*$")

Daje mi wyjście:

['           showToastByText("该功能暂未开放");']

Co jest prawie w porządku, ale czego chcę, to tylko część chińskich znaków.

Próbowałem dodać "()", ale po prostu nie może odebrać części, którą chcę.

Wszelkie porady zostaną docenione, dzięki :)

2
supersuraccoon 20 luty 2019, 07:10

2 odpowiedzi

Najlepsza odpowiedź

Nie potrzebujesz tak złożonego regexa, aby tylko negować {X0}} w swoim wejściu i przechwytywanie chińskich znaków, które pojawiają się w kolejności razem. Do odrzucenia linii zawierających {x1}} tylko to (?!.*//)} Negatywny wygląd w przyszłość jest wystarczający i do przechwytywania chińskiego tekstu, możesz uchwycić z tą regex {x3}}, a ogólny regulamin staje się tym,

^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)

Gdzie można wyodrębnić chińskie znaki z pierwszego wzoru grupowania.

Objaśnienie powyższego REGEX:

  • ^ - początek ciągu
  • (?!.*//) - Negatywny wygląd, który wyrzuci mecz, jeśli // jest obecny w linii w dowolnym miejscu
  • [^\u4e00-\u9fff]* - Opcjonalnie pasuje do zero lub więcej znaków nie-chińskich
  • ([\u4e00-\u9fff]+) - Przechwytuje chińskie znaki jeden lub więcej i wtedy w pierwszym wzorzeniu grupowania.

Demo

Edytuj: Oto przykładowe kody pokazujące, jak przechwytywać tekst z grupy1

import re

s = '           showToastByText("该功能暂未开放");'

m = re.search(r'^(?!.*//)[^\u4e00-\u9fff]*([\u4e00-\u9fff]+)',s)
if (m):
 print(m.group(1))

Wydruki,

该功能暂未开放

Online Python Demo.

Edytuj: Do wyodrębniania wielu wystąpień chińskich znaków, jak wspomniano w komentarzu

Chcesz wyodrębnić wiele wystąpień chińskich znaków, możesz sprawdzić, czy ciąg nie zawiera //, a następnie użyj findall, aby wyodrębnić cały chiński tekst. Oto przykładowy kod pokazujący to samo,

import re

arr = ['showToastByText("该功能暂未开放");','//showToastByText("该功能暂未开放");','showToastByText("未开放");','showToastByText("该功能暂xxxxxx未开放");']

for s in arr:
 if (re.match(r'\/\/', s)):
  print(s, ' --> contains // hence not finding')
 else:
  print(s, ' --> ', re.findall(r'[\u4e00-\u9fff]+',s))

Wydruki,

showToastByText("该功能暂未开放");  -->  ['该功能暂未开放']
//showToastByText("该功能暂未开放");  --> contains // hence not finding
showToastByText("未开放");  -->  ['未开放']
showToastByText("该功能暂xxxxxx未开放");  -->  ['该功能暂', '未开放']

Online Python Demo.

0
Pushpesh Kumar Rajwanshi 20 luty 2019, 09:12

Nie potrzebujesz pozytywnego wyglądu, aby uzyskać chińskie znaki (jak nic nie pasuje). Możemy więc przepisać tę część, aby zrobić leniwy mecz do .*, aż znajdzie pożądane znaki.

Jako taki, używając:

^(?=^(?:(?!//).)*$).*?([\u4e00-\u9fff]+).*$

Twoja pierwsza grupa przechwytywania będzie chińskimi znakami

0
Bass 20 luty 2019, 04:21