регулярное выражение Python объединяет шаблоны с AND и группой - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь использовать регулярные выражения для сопоставления чего-либо, удовлетворяющего следующим условиям:

  1. не содержат строку "//"
  2. содержат китайские символы
  3. взять эти китайские иероглифы

Я читаю построчно из файла:

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

Сначала я попытался сопоставить китайские иероглифы, используя следующий шаблон:

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

это работает и дает мне вывод:

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

Затем я попытался исключить "//" со следующим шаблоном и объединить его с вышеуказанным шаблоном:

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

это дает мне вывод:

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

, что почти правильно, но я хочу только часть китайских символов.

Я пытался добавить "()", но просто не могу подобратьчасть, которую я хочу.

Любой совет будет оценен, спасибо:)

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вам не нужно столь сложное регулярное выражение, чтобы просто отрицать // во вводе и фиксировать китайские иероглифы, которые появляются последовательно.Для отбрасывания строк, содержащих //, достаточно только этого (?!.*//) отрицательного просмотра вперед, а для захвата текста на китайском языке вы можете захватить это регулярное выражение [^\u4e00-\u9fff]*([\u4e00-\u9fff]+), и ваше общее регулярное выражение станет таким:

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

Где вы можете извлечь китайские символы из первого шаблона группировки.

Объяснение вышеприведенного регулярного выражения:

  • ^ - Начало строки
  • (?!.*//) - Отрицательный взгляд вперед, который отбрасывает совпадение, если // присутствует в строке где-либо впереди
  • [^\u4e00-\u9fff]* - Опционально соответствует нулю или большему количеству некитайских символов
  • ([\u4e00-\u9fff]+) - Захватывает китайские иероглифы один или несколько и затем помещает их в первый шаблон группировки.

Демо

Редактировать: Здесьпримеры кодов, показывающие, как захватывать текст из группы 1

import re

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

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

Prints,

该功能暂未开放

Демонстрационная версия Python онлайн

Редактировать: для извлечения нескольких вхождений китайских иероглифов, как указано в коммent

Поскольку вы хотите извлечь многократные вхождения китайских символов, вы можете проверить, не содержит ли строка //, а затем использовать findall для извлечения всего китайского текста.Вот пример кода, демонстрирующего то же самое,

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))

Prints,

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

Демонстрационная версия Python онлайн

0 голосов
/ 20 февраля 2019

Вам не нужен позитивный взгляд, чтобы получить китайские иероглифы (так как они ничего не будут совпадать).Таким образом, мы можем переписать эту часть, чтобы сделать ленивое совпадение для .*, пока он не найдет нужные символы.

Таким образом, используя:

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

Ваш первыйгруппа захвата будет китайские иероглифы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...