Как использовать регулярное выражение Python для выбора всего до шаблона

#python #python-3.x #regex

#python #python-3.x #регулярное выражение

Вопрос:

Когда у меня есть такой ввод

 [headline - https://prachatai.com/journal/2020/10/89984]
'ประยุทธ์' ขอบคุณทุกฝ่าย ยืนยันเจ้าหน้าที่ปฏิบัติตามหลักสากลทุกประการ - ด้านตำรวจยืนยันไม่มีการใช้กระสุนยางและแก๊สน้ำตากระชับพื้นที่ผู้ชุมนุม ระบุสารเคมีผสมน้ำไม่มีอันตราย ใช้เพื่อระุบตัวผู้ชุมนุมดำเนินคดีในอนาคต
เมื่อคืนวันที่ 16 ต.ค. 2563 อนุชา บูรพชัยศรี โฆษกประจำสำนักนายกรัฐมนตรี เปิดเผยว่า พล.อ. ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี และรัฐมนตรีว่าการกระทรวงกลาโหม ขอขอบคุณเจ้าหน้าที่ทุกฝ่าย ประชาชนทุกกลุ่ม และผู้ชุมนุมที่ให้ความร่วมมือกับทางเจ้าหน้าที่ของรัฐในการยุติการชุมนุม
[headline - https://prachatai.com/english/about/internship]
Here is some english text
[headline - https://prachatai.com/english/node/8813]
Foreigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has greatly contributed to the expansion of foreign participation in protests.
A protester with a Guy Fawkes mask at the 19 Sept protest.
[headline - https://prachatai.com/journal/2020/10/89903]
ต.ค.62-ก.ย.63 แรงงานไทยในต่างประเทศส่งเงินกลับบ้าน 200,254 ล้านบาท
นายสุชาติ ชมกลิ่น รัฐมนตรีว่าการกระทรวงแรงงาน เปิดเผยว่า นับจากช่วงที่ประเทศไทยเข้าสู่สถานการณ์การแพร่ระบาดของโรคโควิด-19 ส่งผลกระทบต่อการจัดส่งแรงงานไทยไปทำงานต่างประเทศในภาพรวม เนื่องจากหลายประเทศที่เป็นเป้าหมายในการเดินทางไปทำงานของแรงงานไทย ชะลอการรับคนต่างชาติเข้าประเทศ
  

мое регулярное выражение захватывает

 [headline - https://prachatai.com/english/about/internship]
Here is some english text
[headline - https://prachatai.com/english/node/8813]
Foreigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has greatly contributed to the expansion of foreign participation in protests.
A protester with a Guy Fawkes mask at the 19 Sept protest.
  

чего я и хочу. Однако, когда у меня есть [] в тексте статьи, он захватывается только до скобок. Вы можете обратиться к нему здесь https://regex101.com/r/GMtEQS/2

мое текущее регулярное выражение [headline.*/english[^]]*][^[$]*

Как мне выбрать все до следующего [headline ?

ожидаемый результат

 [headline - https://prachatai.com/english/about/internship]
Here is some english text
[headline - https://prachatai.com/english/node/8813]
Foreigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has [] greatly contributed to the expansion of foreign participation in protests.
A protester with a Guy Fawkes mask at the 19 Sept protest.
  

Комментарии:

1. Помог ли вам какой-либо из предоставленных ответов решить проблему?

Ответ №1:

Отрицаемый символьный класс [^[$]* не соответствует [ или $ . Вместо этого вы можете сопоставить заголовки между [ и ] , а затем сопоставить все строки, которые не начинаются с этого шаблона, сопоставив все возможные символы между ними.

Чтобы сопоставить все заголовки, содержащие https: //, вы могли бы использовать

 ^[headlineb[^][]*https?://[^][]*](?:r?n(?![[headline]).*)*
  

Шаблон по частям

  • ^ Начало строки
  • [headlineb Совпадение с открытием [ , headline за которым следует граница слова
  • [^][]*https?://[^][]* Сопоставьте http с необязательным s и :// между любым символом, кроме [ и ]
  • ] Сопоставьте закрытие ]
  • (?: Не группа захвата
    • r?n Сопоставьте новую строку
    • (?![[headline]).* Сопоставьте всю строку, если она не начинается с [headline
  • )* Закройте группу без захвата и повторите 0 раз

Смотрите демонстрацию регулярных выражений и демонстрацию Python

Например

 import re

regex = r"^[headlineb[^][]*https?://[^][]*](?:r?n(?![[headline]).*)*"

s = ("[headline - https://prachatai.com/journal/2020/10/89984]n"
            "'ประยุทธ์' ขอบคุณทุกฝ่าย ยืนยันเจ้าหน้าที่ปฏิบัติตามหลักสากลทุกประการ - ด้านตำรวจยืนยันไม่มีการใช้กระสุนยางและแก๊สน้ำตากระชับพื้นที่ผู้ชุมนุม ระบุสารเคมีผสมน้ำไม่มีอันตราย ใช้เพื่อระุบตัวผู้ชุมนุมดำเนินคดีในอนาคตn"
            "เมื่อคืนวันที่ 16 ต.ค. 2563 อนุชา บูรพชัยศรี โฆษกประจำสำนักนายกรัฐมนตรี เปิดเผยว่า พล.อ. ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี และรัฐมนตรีว่าการกระทรวงกลาโหม ขอขอบคุณเจ้าหน้าที่ทุกฝ่าย ประชาชนทุกกลุ่ม และผู้ชุมนุมที่ให้ความร่วมมือกับทางเจ้าหน้าที่ของรัฐในการยุติการชุมนุมn"
            "[headline - https://prachatai.com/english/about/internship]n"
            "Here is some english textn"
            "[headline - https://prachatai.com/english/node/8813]n"
            "Foreigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has greatly contributed to the expansion of foreign participation in protests.n"
            "A protester with a Guy Fawkes mask at the 19 Sept protest.n"
            "[headline - https://prachatai.com/journal/2020/10/89903]n"
            "ต.ค.62-ก.ย.63 แรงงานไทยในต่างประเทศส่งเงินกลับบ้าน 200,254 ล้านบาทn"
            "นายสุชาติ ชมกลิ่น รัฐมนตรีว่าการกระทรวงแรงงาน เปิดเผยว่า นับจากช่วงที่ประเทศไทยเข้าสู่สถานการณ์การแพร่ระบาดของโรคโควิด-19 ส่งผลกระทบต่อการจัดส่งแรงงานไทยไปทำงานต่างประเทศในภาพรวม เนื่องจากหลายประเทศที่เป็นเป้าหมายในการเดินทางไปทำงานของแรงงานไทย ชะลอการรับคนต่างชาติเข้าประเทศ")

matches = re.findall(regex, s, re.MULTILINE)
print(matches)
  

Вывод

 ["[headline - https://prachatai.com/journal/2020/10/89984]n'ประยุทธ์' ขอบคุณทุกฝ่าย ยืนยันเจ้าหน้าที่ปฏิบัติตามหลักสากลทุกประการ - ด้านตำรวจยืนยันไม่มีการใช้กระสุนยางและแก๊สน้ำตากระชับพื้นที่ผู้ชุมนุม ระบุสารเคมีผสมน้ำไม่มีอันตราย ใช้เพื่อระุบตัวผู้ชุมนุมดำเนินคดีในอนาคตnเมื่อคืนวันที่ 16 ต.ค. 2563 อนุชา บูรพชัยศรี โฆษกประจำสำนักนายกรัฐมนตรี เปิดเผยว่า พล.อ. ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี และรัฐมนตรีว่าการกระทรวงกลาโหม ขอขอบคุณเจ้าหน้าที่ทุกฝ่าย ประชาชนทุกกลุ่ม และผู้ชุมนุมที่ให้ความร่วมมือกับทางเจ้าหน้าที่ของรัฐในการยุติการชุมนุม", '[headline - https://prachatai.com/english/about/internship]nHere is some english text', '[headline - https://prachatai.com/english/node/8813]nForeigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has greatly contributed to the expansion of foreign participation in protests.nA protester with a Guy Fawkes mask at the 19 Sept protest.', '[headline - https://prachatai.com/journal/2020/10/89903]nต.ค.62-ก.ย.63 แรงงานไทยในต่างประเทศส่งเงินกลับบ้าน 200,254 ล้านบาทnนายสุชาติ ชมกลิ่น รัฐมนตรีว่าการกระทรวงแรงงาน เปิดเผยว่า นับจากช่วงที่ประเทศไทยเข้าสู่สถานการณ์การแพร่ระบาดของโรคโควิด-19 ส่งผลกระทบต่อการจัดส่งแรงงานไทยไปทำงานต่างประเทศในภาพรวม เนื่องจากหลายประเทศที่เป็นเป้าหมายในการเดินทางไปทำงานของแรงงานไทย ชะลอการรับคนต่างชาติเข้าประเทศ']
  

Ответ №2:

Вы могли бы использовать позитивный прогноз.

Если вы измените [^[$]* значение [^$]* на «не совпадать с квадратной скобкой» и добавите (?=[headline) , что означает «сопоставлять все, за чем следует [headline «, так что вы получите ожидаемый результат.

https://regex101.com/r/GMtEQS/3

Основная проблема — вы никогда не получите последний блок таким образом. Я не уверен, как это преодолеть.

https://regex101.com/r/GMtEQS/4

Но мы используем python, да? Что делать, если использовать re.split? Разделите весь текст по заголовкам и обработайте каждый фрагмент в python.

main.py

 import re

text = """[headline - https://prachatai.com/journal/2020/10/89984]
'ประยุทธ์' ขอบคุณทุกฝ่าย ยืนยันเจ้าหน้าที่ปฏิบัติตามหลักสากลทุกประการ - ด้านตำรวจยืนยันไม่มีการใช้กระสุนยางและแก๊สน้ำตากระชับพื้นที่ผู้ชุมนุม ระบุสารเคมีผสมน้ำไม่มีอันตราย ใช้เพื่อระุบตัวผู้ชุมนุมดำเนินคดีในอนาคต
เมื่อคืนวันที่ 16 ต.ค. 2563 อนุชา บูรพชัยศรี โฆษกประจำสำนักนายกรัฐมนตรี เปิดเผยว่า พล.อ. ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี และรัฐมนตรีว่าการกระทรวงกลาโหม ขอขอบคุณเจ้าหน้าที่ทุกฝ่าย ประชาชนทุกกลุ่ม และผู้ชุมนุมที่ให้ความร่วมมือกับทางเจ้าหน้าที่ของรัฐในการยุติการชุมนุม
[headline - https://prachatai.com/english/about/internship]
Here is some english text
[headline - https://prachatai.com/english/node/8813]
Foreigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has [] greatly contributed to the expansion of foreign participation in protests.
A protester with a Guy Fawkes mask at the 19 Sept protest.
[headline - https://prachatai.com/journal/2020/10/89903]
ต.ค.62-ก.ย.63 แรงงานไทยในต่างประเทศส่งเงินกลับบ้าน 200,254 ล้านบาท
นายสุชาติ ชมกลิ่น รัฐมนตรีว่าการกระทรวงแรงงาน เปิดเผยว่า นับจากช่วงที่ประเทศไทยเข้าสู่สถานการณ์การแพร่ระบาดของโรคโควิด-19 ส่งผลกระทบต่อการจัดส่งแรงงานไทยไปทำงานต่างประเทศในภาพรวม เนื่องจากหลายประเทศที่เป็นเป้าหมายในการเดินทางไปทำงานของแรงงานไทย ชะลอการรับคนต่างชาติเข้าประเทศ"""

chunks = re.split(r'([headline - https://prachatai.com.*])n', text)

for i in range(1, len(chunks), 2):
    headline = chunks[i]
    body = chunks[i 1]
    if 'english' in headline:
        print(headline)
        print(body)
  
 $ python3 main.py 
[headline - https://prachatai.com/english/about/internship]
Here is some english text

[headline - https://prachatai.com/english/node/8813]
Foreigners attended the protest at Thammasat University to show their support for the people of Thailand and their fight for democracy. The use of social media has [] greatly contributed to the expansion of foreign participation in protests.
A protester with a Guy Fawkes mask at the 19 Sept protest.
  

Комментарии:

1. Отличный ответ! Я не думал о том, чтобы решить это таким образом. Единственная причина, по которой я использовал это, заключалась в re.sub(english_article_regex, "", all_articles, 0, re.MULTILINE) том, чтобы исключить английские тексты и получить только тайский текст не на английском языке. Как мне получить неанглоязычные, у которых нет enligh в их URL?

2. также не все URL-адреса имеют prachatai.com , поэтому он не будет работать для всех заголовков. Не могли бы вы изменить его для более общего? только для https://* ?