Hướng dẫn python regex search multiline - python regex tìm kiếm nhiều dòng

re.search with \s or '\n' is not finding the multiline i'm trying to search for.

Portion of Source:

Date/Time:
2013-08-27 17:05:36 

----- BEGIN SEARCH -----

GENERAL DATA:
NAME:   AB12
SECTOR: 
999,999
CONTROLLED BY:  Player
ALLIANCE:   Aliance
ONLINE: 1 seconds ago
SIZE:   Large
HOMEWORLD:  NO
APPROVAL RATING:    100%
PRODUCTION RATE:    100%

RESOURCE DATA:
POWER:  0 / 0
BUILDINGS:  0 / 20
ORE:    80,000 / 80,000
CRYSTAL:    80,000 / 80,000
POPULATION: 40,000 / 40,000

BUILDING DATA:
N/A

UNIT DATA:
WYVERN(S):  100

----- END SEARCH -----

Looking at it in Notepad++ I see "BUILDING DATA:(LF)"

Full Code

lines = open('scan.txt','r').readlines()
for a in lines:
    if re.search(r"\A\d", a):
        digits = a
        if re.search(r"2013", digits):
            date.append(digits[:19])
            count +=1
        elif re.search(r",", digits):
            clean = digits.rstrip()
            sector = clean.split(',')
            x.append(sector[0])
            y.append(sector[1])
    elif re.search(r"CONTROLLED BY:", a):
        player.append(a[15:].rstrip())
    elif re.search(r"ALLIANCE:", a):
        alliance.append(a[10:].rstrip())
    elif re.search(r"SIZE:", a):
        size.append(a[6:].rstrip())
    elif re.findall('BUILDING DATA:\sN/A', a, re.M):
        def_grid = ''
        print "Didn't find it"
        defense.append(def_grid)
        defense_count +=1
    elif re.search(r"DEFENSE GRID", a):
        def_grid = a[16:].rstrip()
        print "defense found"
        defense_count +=1

But I am not having anything returned.

I need to put an empty spacer in when "DEFENSE GRID" doesn't exist after "BUILDING DATA:"

I know i'm missing something and I've tried reading up on re.search but i'm not able to find any thorough examples that explain how the multiline works.

Tôi biết rằng để phân tích cú pháp, tôi nên loại bỏ tất cả các không gian và đường dây nhưng tôi chỉ làm điều này như một cách khắc phục nhanh chóng cho một cái gì đó tôi đang thử và tôi không thể hiểu tại sao nó không hoạt động .. Tôi đã kết thúc các khu vực văn bản khác nhau trong Tài liệu với các trình bao bọc như "#### 1" và đang cố gắng phân tích cú pháp dựa trên điều này nhưng nó không hoạt động bất kể tôi cố gắng gì, tôi nghĩ rằng tôi đang sử dụng đa dòng chính xác .. bất kỳ lời khuyên nào cũng được đánh giá cao

Nội dung chính

  • 1. Làm việc với các chuỗi đa dòng
  • 2. Trận đấu tham lam vs không tham lam
  • 3. Thay thế bằng các biểu thức thông thường
  • Làm thế nào để bạn phù hợp với nhiều dòng trong Python?
  • Cờ nào sẽ tìm kiếm trên nhiều dòng trong Python?
  • Cờ nào sẽ tìm kiếm trên nhiều dòng?
  • Làm thế nào để phù hợp với Backslash trong Regex Python?

Điều này trả về không có kết quả nào cả:

string='
####1
ttteest
####1
ttttteeeestt

####2   

ttest
####2'

import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch

Hỏi ngày 20 tháng 8 năm 2010 lúc 20:09Aug 20, 2010 at 20:09Aug 20, 2010 at 20:09

4

Multiline không có nghĩa là

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
4 sẽ phù hợp với lợi nhuận dòng, điều đó có nghĩa là
  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
5 và
  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
6 chỉ giới hạn ở các dòng

Re.m Re.Multiline

Khi được chỉ định, ký tự mẫu '^' khớp ở đầu chuỗi và ở đầu> đầu của mỗi dòng (ngay sau mỗi dòng mới); và ký tự mẫu '$'> khớp ở cuối chuỗi và ở cuối mỗi dòng (ngay trước mỗi> Newline). Theo mặc định, '^' chỉ khớp với đầu chuỗi và '$' chỉ ở đầu> của chuỗi và ngay trước dòng mới (nếu có) ở cuối chuỗi.

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
7 hoặc
  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
8 làm cho
  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
4 khớp với ngay cả các dòng mới.

Nguồn

http://docs.python.org/

Đã trả lời ngày 20 tháng 8 năm 2010 lúc 20:16Aug 20, 2010 at 20:16Aug 20, 2010 at 20:16

Colin Hebertcolin HebertColin HebertColin Hebert

89,8K15 Huy hiệu vàng156 Huy hiệu bạc148 Huy hiệu đồng15 gold badges156 silver badges148 bronze badges15 gold badges156 silver badges148 bronze badges

Hãy thử

  >>> re.search(r'

.*

', paragraph) >>>
0 (tất nhiên cũng hoạt động với
  >>> re.search(r'

.*

', paragraph) >>>
1).

RegEXP này sẽ trả về các bộ dữ liệu chứa số lượng của phần và nội dung phần.

Ví dụ của bạn, điều này sẽ trả về

  >>> re.search(r'

.*

', paragraph) >>>
2.

(BTW: Ví dụ của bạn sẽ không chạy, cho các chuỗi đa dòng, sử dụng

  >>> re.search(r'

.*

', paragraph) >>>
3 hoặc
  >>> re.search(r'

.*

', paragraph) >>>
4)

Đã trả lời ngày 20 tháng 8 năm 2010 lúc 20:16Aug 20, 2010 at 20:16Aug 20, 2010 at 20:16

Colin Hebertcolin HebertColin Hebertleoluk

89,8K15 Huy hiệu vàng156 Huy hiệu bạc148 Huy hiệu đồng15 gold badges156 silver badges148 bronze badges6 gold badges42 silver badges50 bronze badges

0

Hãy thử

  >>> re.search(r'

.*

', paragraph) >>>
0 (tất nhiên cũng hoạt động với
  >>> re.search(r'

.*

', paragraph) >>>
1).

  1. RegEXP này sẽ trả về các bộ dữ liệu chứa số lượng của phần và nội dung phần.
  2. Ví dụ của bạn, điều này sẽ trả về
  3. (BTW: Ví dụ của bạn sẽ không chạy, cho các chuỗi đa dòng, sử dụng


  >>> re.search(r'

.*

', paragraph) >>>
3 hoặc
  >>> re.search(r'

.*

', paragraph) >>>
4)

1. Làm việc với các chuỗi đa dòng

Colin Hebertcolin Hebertleoluk

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>

89,8K15 Huy hiệu vàng156 Huy hiệu bạc148 Huy hiệu đồng6 gold badges42 silver badges50 bronze badges

  >>> re.search(r'

.*

', paragraph) >>>

Bài viết này là một phần của một loạt các bài viết về các biểu thức thường xuyên của Python.

Bài viết này là sự tiếp nối về chủ đề này và sẽ xây dựng dựa trên những gì chúng tôi đã học trước đây. Trong bài viết này, chúng tôi sẽ thảo luận:

Làm việc với các chuỗi / trận đấu đa dòng

lines = open('scan.txt','r').readlines()
for a in lines:
    if re.search(r"\A\d", a):
        digits = a
        if re.search(r"2013", digits):
            date.append(digits[:19])
            count +=1
        elif re.search(r",", digits):
            clean = digits.rstrip()
            sector = clean.split(',')
            x.append(sector[0])
            y.append(sector[1])
    elif re.search(r"CONTROLLED BY:", a):
        player.append(a[15:].rstrip())
    elif re.search(r"ALLIANCE:", a):
        alliance.append(a[10:].rstrip())
    elif re.search(r"SIZE:", a):
        size.append(a[6:].rstrip())
    elif re.findall('BUILDING DATA:\sN/A', a, re.M):
        def_grid = ''
        print "Didn't find it"
        defense.append(def_grid)
        defense_count +=1
    elif re.search(r"DEFENSE GRID", a):
        def_grid = a[16:].rstrip()
        print "defense found"
        defense_count +=1
6

Tham lam so với phù hợp không tham lam

Thay thế bằng cách sử dụng các biểu thức thông thường

lines = open('scan.txt','r').readlines()
for a in lines:
    if re.search(r"\A\d", a):
        digits = a
        if re.search(r"2013", digits):
            date.append(digits[:19])
            count +=1
        elif re.search(r",", digits):
            clean = digits.rstrip()
            sector = clean.split(',')
            x.append(sector[0])
            y.append(sector[1])
    elif re.search(r"CONTROLLED BY:", a):
        player.append(a[15:].rstrip())
    elif re.search(r"ALLIANCE:", a):
        alliance.append(a[10:].rstrip())
    elif re.search(r"SIZE:", a):
        size.append(a[6:].rstrip())
    elif re.findall('BUILDING DATA:\sN/A', a, re.M):
        def_grid = ''
        print "Didn't find it"
        defense.append(def_grid)
        defense_count +=1
    elif re.search(r"DEFENSE GRID", a):
        def_grid = a[16:].rstrip()
        print "defense found"
        defense_count +=1
7

Trong bài viết đầu tiên của loạt bài này, chúng tôi đã học được những điều cơ bản khi làm việc với các biểu thức thường xuyên trong Python.

Có một vài kịch bản có thể phát sinh khi bạn đang làm việc với một chuỗi nhiều dòng (được phân tách bởi các ký tự mới-‘\ n,). Một trường hợp là bạn có thể muốn phù hợp với một cái gì đó kéo dài nhiều hơn một dòng. Hãy xem xét đoạn này của HTML:

lines = open('scan.txt','r').readlines()
for a in lines:
    if re.search(r"\A\d", a):
        digits = a
        if re.search(r"2013", digits):
            date.append(digits[:19])
            count +=1
        elif re.search(r",", digits):
            clean = digits.rstrip()
            sector = clean.split(',')
            x.append(sector[0])
            y.append(sector[1])
    elif re.search(r"CONTROLLED BY:", a):
        player.append(a[15:].rstrip())
    elif re.search(r"ALLIANCE:", a):
        alliance.append(a[10:].rstrip())
    elif re.search(r"SIZE:", a):
        size.append(a[6:].rstrip())
    elif re.findall('BUILDING DATA:\sN/A', a, re.M):
        def_grid = ''
        print "Didn't find it"
        defense.append(def_grid)
        defense_count +=1
    elif re.search(r"DEFENSE GRID", a):
        def_grid = a[16:].rstrip()
        print "defense found"
        defense_count +=1
8

Chúng tôi có thể muốn lấy toàn bộ thẻ đoạn văn (nội dung và tất cả). Chúng tôi sẽ mong đợi để tìm thấy điều này. Tuy nhiên, như chúng ta thấy dưới đây, điều này không hoạt động.

2. Trận đấu tham lam vs không tham lam

Vấn đề với tìm kiếm biểu thức chính quy này là, theo mặc định, nhân vật đặc biệt ‘. Không phù hợp với các ký tự dòng mới.

Có một sửa chữa dễ dàng cho điều này mặc dù. Các phương thức truy vấn gói ’re có thể tùy ý chấp nhận một số cờ được xác định trước để sửa đổi cách thức hoạt động của các ký tự đặc biệt.

lines = open('scan.txt','r').readlines()
for a in lines:
    if re.search(r"\A\d", a):
        digits = a
        if re.search(r"2013", digits):
            date.append(digits[:19])
            count +=1
        elif re.search(r",", digits):
            clean = digits.rstrip()
            sector = clean.split(',')
            x.append(sector[0])
            y.append(sector[1])
    elif re.search(r"CONTROLLED BY:", a):
        player.append(a[15:].rstrip())
    elif re.search(r"ALLIANCE:", a):
        alliance.append(a[10:].rstrip())
    elif re.search(r"SIZE:", a):
        size.append(a[6:].rstrip())
    elif re.findall('BUILDING DATA:\sN/A', a, re.M):
        def_grid = ''
        print "Didn't find it"
        defense.append(def_grid)
        defense_count +=1
    elif re.search(r"DEFENSE GRID", a):
        def_grid = a[16:].rstrip()
        print "defense found"
        defense_count +=1
9

Cờ Re.dotall bảo Python tạo ra ‘. Nhân vật đặc biệt phù hợp với tất cả các nhân vật, bao gồm cả các ký tự mới. Hãy để thử nó ra:

string='
####1
ttteest
####1
ttttteeeestt

####2   

ttest
####2'

import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
0

Tuy nhiên, chúng tôi thấy rằng (có lẽ bất ngờ) điều này phù hợp với toàn bộ đoạn trích.

Đây là một ví dụ điển hình về cách các biểu thức thường xuyên tham lam theo mặc định, phần ‘.*Của biểu thức chính quy được mở rộng càng nhiều càng tốt trong khi vẫn thỏa mãn trận đấu. Chúng ta có thể nói với Python đừng tham lam (nghĩa là ngừng mở rộng các ký tự đặc biệt sau khi tìm thấy chuỗi con phù hợp nhất) bằng cách sử dụng ký tự ‘?

string='
####1
ttteest
####1
ttttteeeestt

####2   

ttest
####2'

import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
1

Bằng cách gắn nhân vật mở rộng ‘**với một‘?

3. Thay thế bằng các biểu thức thông thường

Một nhiệm vụ khác mà gói RE cho phép bạn thực hiện bằng cách sử dụng các biểu thức thông thường là thực hiện thay thế trong một chuỗi. Các phương thức Sub () có một biểu thức và cụm từ chính quy giống như các phương thức truy vấn mà chúng tôi đã thấy cho đến nay, nhưng chúng tôi cũng giao trong chuỗi để thay thế mỗi trận đấu. Bạn có thể thực hiện các thay thế đơn giản như thế này:

string='
####1
ttteest
####1
ttttteeeestt

####2   

ttest
####2'

import re
pattern = '.*?####(.*?)####'
returnmatch = re.compile(pattern, re.MULTILINE).findall(string)
return returnmatch
2

Điều này thay thế mọi từ được tìm thấy bằng chuỗi theo nghĩa đen ‘Word. Bạn cũng có thể tham chiếu trận đấu trong chuỗi thay thế bằng nhóm (chúng tôi đã tìm hiểu về nhóm trong bài viết trước):

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
0

Trong trường hợp này, chúng tôi ghi lại chữ cái đầu tiên của mỗi từ trong nhóm đầu tiên, và sau đó gọi nó trong chuỗi thay thế bằng cú pháp ‘\ g. Nếu chúng tôi không sử dụng các nhóm được đặt tên, chúng tôi có thể chỉ định số nhóm thay vì tên nhóm:

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
1

Đôi khi, nhu cầu thay thế của chúng tôi phức tạp hơn những gì có thể được chỉ định trong một chuỗi thay thế đơn giản.

Đối với điều này, phương thức phụ () cũng có thể chấp nhận hàm thay thế thay vì một chuỗi thay thế theo nghĩa đen.

Hàm thay thế sẽ chấp nhận một đối số duy nhất, sẽ là một đối tượng khớp và trả về một chuỗi. Phương thức Sub () sẽ gọi hàm này trên mỗi trận đấu được tìm thấy và thay thế nội dung phù hợp bằng giá trị trả về hàm.

Để chứng minh điều này, hãy viết một hàm sẽ cho phép chúng tôi tạo một chuỗi tùy ý thân thiện với URL hơn (nghĩa là chúng tôi sẽ chuyển đổi tất cả các ký tự thành chữ thường và thay thế loạt khoảng trống bằng một ký tự ‘_ _).

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
2

Hàm của chúng tôi chấp nhận một đối tượng khớp và trả về một chuỗi, giống như yêu cầu của hàm phụ.

Bây giờ chúng ta có thể sử dụng chức năng này để slugify và chuỗi tùy ý. Chúng tôi khớp với một loạt các ký tự từ hoặc một loạt các không gian (ký tự đặc biệt '|' về cơ bản là hoặc toán tử cho các biểu thức chính quy. Để trở thành một kết hợp hợp lệ, nội dung phải khớp với mẫu bên trái của '|' hoặc mẫu ở bên phải của '|'). Phương thức Sub () sẽ chuyển từng đối tượng đối sánh cho hàm slugify () của chúng tôi:

  >>> paragraph = \
  ... '''
  ... 

... This is a paragraph. ... It has multiple lines. ...

... ''' >>>
3

Lưu ý rằng chúng tôi chuyển một tham chiếu đến đối tượng hàm vào phương thức phụ () (nghĩa là chúng tôi không gọi hàm). Hãy nhớ rằng phương thức SUB () sẽ gọi hàm slugify trên mỗi đối tượng khớp cho chúng tôi.

Dành một phút để hiểu dòng chảy của ví dụ cuối cùng này sẽ không chỉ dạy cho bạn cách thức hoạt động của phương thức phụ () mà còn về một số nguyên tắc cơ bản của Python. Python coi các chức năng là công dân hạng nhất. Chúng có thể được trao xung quanh giống như bất kỳ đối tượng nào khác có thể (trên thực tế, các chức năng là các đối tượng trong Python).

Như mọi khi, để tìm hiểu nhiều hơn về các biểu thức thông thường và gói ’re, hãy xem tài liệu Python chính thức cho re packHttps: //docs.python.org/2/l Library/re.html.

Trong bài viết này, chúng tôi đã làm việc sâu hơn một chút khi làm việc với các biểu hiện thường xuyên trong Python. Chúng tôi đã học về việc làm việc với các chuỗi nhiều dòng và cách các cờ Re.Dotall và Re.Multiline có thể thay đổi hành vi của một số nhân vật đặc biệt để phù hợp hơn với nhu cầu của chúng tôi. Chúng tôi cũng đã nói về cách các biểu thức thường xuyên tham lam theo mặc định (chúng mở rộng để tạo ra trận đấu lớn nhất), nhưng chúng tôi có thể thay đổi hành vi này bằng cách sử dụng ký tự ‘? Cuối cùng, chúng tôi đã nói về cách chúng tôi có thể thay thế trong một chuỗi, chỉ định thay thế bằng chữ H chrit hoặc hàm thay thế.

Làm thế nào để bạn phù hợp với nhiều dòng trong Python?

Công cụ sửa đổi tìm kiếm đa dòng buộc biểu tượng ^ phải khớp ở đầu mỗi dòng văn bản (và không chỉ là đầu tiên) và biểu tượng $ để khớp ở cuối mỗi dòng văn bản (và không chỉ là bản cuối cùng).

Cờ nào sẽ tìm kiếm trên nhiều dòng trong Python?

Cờ Dotall bảo Python làm '.'Nhân vật đặc biệt phù hợp với tất cả các ký tự, bao gồm các ký tự mới.Đây là một đoạn văn.Nó có nhiều dòng. tells python to make the '. ' special character match all characters, including newline characters. This is a paragraph. It has multiple lines. tells python to make the '. ' special character match all characters, including newline characters. This is a paragraph. It has multiple lines.

Cờ nào sẽ tìm kiếm trên nhiều dòng?

Cờ m chỉ ra rằng một chuỗi đầu vào đa dòng nên được coi là nhiều dòng.Ví dụ: nếu M được sử dụng, ^ và $ thay đổi từ việc khớp chỉ khi bắt đầu hoặc kết thúc toàn bộ chuỗi đến đầu hoặc cuối của bất kỳ dòng nào trong chuỗi.m flag indicates that a multiline input string should be treated as multiple lines. For example, if m is used, ^ and $ change from matching at only the start or end of the entire string to the start or end of any line within the string.m flag indicates that a multiline input string should be treated as multiple lines. For example, if m is used, ^ and $ change from matching at only the start or end of the entire string to the start or end of any line within the string.

Làm thế nào để phù hợp với Backslash trong Regex Python?

Nói tóm lại, để phù hợp với dấu gạch chéo ngược theo nghĩa đen, người ta phải viết '\\\\\\' làm chuỗi re, vì biểu thức thông thường phải là "\\" và mỗi dấu gạch chéo ngược phải được biểu thị là "\\" bên trong một python thông thườngchuỗi chữ.write '\\\\' as the RE string, because the regular expression must be "\\", and each backslash must be expressed as "\\" inside a regular Python string literal.write '\\\\' as the RE string, because the regular expression must be "\\", and each backslash must be expressed as "\\" inside a regular Python string literal.