การจับคู่รูปแบบ Regex ที่จุดเริ่มต้นของสตริงด้วย BeautifulSoup

ขณะนี้ฉันกำลังมองหาวิธีดำเนินการจับคู่รูปแบบผ่าน regex ที่จุดเริ่มต้นของชื่อคลาส HTML รูปแบบที่ฉันพยายามจับคู่คือ:

"col-xs-.*"

สองตัวอย่างของคลาสในหน้า HTML คือ:

<div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">

เป้าหมายคือจับคู่ชื่อคลาสข้างต้นเท่านั้น เนื่องจากจริงๆ แล้วมันขึ้นต้นด้วย "col-xs-.*" ซึ่งเป็นสิ่งที่ฉันตามหา การใช้การจับคู่ regex ปัจจุบันของฉันฉันไม่สามารถแยกชื่อคลาสเหล่านี้ออกมาได้ ขณะนี้ฉันกำลังพยายามจับคู่โดยใช้รูปแบบ regex ต่อไปนี้:

regex = re.compile('^col-xs-.*$')
soup.find_all("div", class_ = regex)

น่าเสียดายที่รูปแบบนี้ยังพิมพ์ชื่อคลาสที่สองออกมาด้วย (โดยที่ "col-xs-.*" ปรากฏตรงกลางและไม่ใช่แค่ตอนเริ่มต้น) หวังว่าบางคนจะมีวิธีแก้ไขปัญหานี้


person Menno Van Dijk    schedule 20.07.2019    source แหล่งที่มา
comment
.* จะตรงกันจนถึงจุดสิ้นสุดของสตริง ลอง \bcol-xs-\d+\b   -  person The fourth bird    schedule 20.07.2019
comment
@Thefourthbird โซลูชันของคุณดูเหมือนจะไม่ทำงาน และมันสำคัญไหมที่ .* จะจับคู่กันจนจบสตริง? ทั้งหมดที่ฉันต้องการก็แค่เพื่อให้รูปแบบปรากฏที่จุดเริ่มต้นของสตริง ส่วนส่วนที่เหลือที่เกิดขึ้นหลังจากนั้นนั้นไม่ได้สำคัญขนาดนั้น ฉันคิดว่า   -  person Menno Van Dijk    schedule 20.07.2019


คำตอบ (3)


ฉันคิดว่าคุณต้องการ attribute = value css selector ที่ขึ้นต้นด้วย ตัวดำเนินการ ^ เพื่อระบุสตริงคำนำหน้าเพื่อค้นหาในแอตทริบิวต์คลาส

soup.select('[class^="col-xs-"]')

ตัวอย่าง:

from bs4 import BeautifulSoup as bs

html = '''
<div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">
'''
soup = bs(html, 'lxml')
classes = [' '.join(item['class']) for item in soup.select('[class^="col-xs-"]')]
print(classes)
person QHarr    schedule 20.07.2019

ฉันเดาว่านิพจน์นี้อาจดึงคลาสที่ต้องการออกมาได้:

import re

regex = r"[\"']\s*(\bcol-xs-[0-9]+\b[^\"']+?)\s*[\"']"

test_str = """

<div class="col-xs-12 col-sm-12 col-lg-12"><div class="  col-xs-12 col-sm-12 col-lg-12  ">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3"><div class="col-xs-12 col-sm-12 col-lg-12">
<div class="mod-tiles__sizer col-xs-6 col-sm-4 col-lg-3">

"""

print(re.findall(regex, test_str, re.MULTILINE | re.IGNORECASE))

เอาท์พุต

['col-xs-12 col-sm-12 col-lg-12', 'col-xs-12 col-sm-12 col-lg-12', 'col-xs-12 col-sm-12 col-lg-12']

มีการอธิบายนิพจน์ไว้ที่แผงด้านขวาบนของ regex101.com หากคุณต้องการสำรวจ/ ลดความซับซ้อน/แก้ไข และในลิงก์นี้ คุณสามารถดูได้ว่ามันจะจับคู่กับตัวอย่างบางส่วนอย่างไร อินพุตหากคุณต้องการ

person Emma    schedule 20.07.2019

หากคุณต้องการค้นหาโดยไม่ต้องดูหรูหรา นี่คือวิธีที่ควรทำ
แท็ก div ทั้งหมดที่มีแอตทริบิวต์คลาสโดยที่ col-xs- อยู่ที่จุดเริ่มต้นของค่า:

รวมถึงการตัดแต่งช่องว่าง

r"(?i)<div(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?(?<=\s)class\s*=\s*(?:(['\"])\s*(col-xs-(?:(?!\1)[\S\s])*?)\s*\1))\s+(?:\"\S\s]*?\"|'\S\s]*?'|[^>]*?)+>"

https://regex101.com/r/rsXqI9/1

จัดรูปแบบ:
ค่าคลาสอยู่ในกลุ่ม 2

 (?i)
 < div 
 (?=
      (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
      (?<= \s )
      class \s* = \s* 
      (?:
           ( ['"] )                      # (1)
           \s* 
           (                             # (2 start)
                col-xs-

                (?:
                     (?! \1 )
                     [\S\s] 
                )*?
           )                             # (2 end)
           \s* 
           \1 
      )
 )
 \s+ 
 (?: " \S\s ]*? " | ' \S\s ]*? ' | [^>]*? )+
 >
person Community    schedule 20.07.2019