簡體   English   中英

python正則表達式僅獲取兩個字符串之間的數據

[英]python regular expression get only data between two strings

我不確定如何在第一個或開頭字符串“ USER ID”和最后一個或結尾字符串“ You can”兩個字符串之間獲取數據。

我想要一切,包括數字句號,特殊字符等。

但是我也想在保存的數據中包括兩個字符串(這些開始和結束字符串代表我想要的數據)。

如何編寫表達式以獲取這些字符串之間的數據,同時還將字符串作為結果的一部分包含在內?

看起來像什么

Body:  Results of
User ID User Score  Full Score  Passing Score   Passing Status  Post Date   Elapsed
1   6   7   5   Pass    2014-9-3 16:12:27   00:00:25
Student Information
Student information
E-mail s
First Name  s
Last Name   s
Information on each question
Question    Question Type   Points  User's Response(s)  Correct Answer  Result
1. A
2. 
3. In l
4. The 
5. A 
Congratulations, you passed!
You can import

我想要的是

包括Body :(包括單詞“ Body:”,以及直到但不包括第二個中斷詞“ you can”(此處的兩個字符串的大小寫可以是大寫或小寫)的行。

所以我最終會遇到很多:

Body: something
1. some question
you passed

要么

Body: Something
1. You a...
2. Another
You Failed

只要它不是遞歸的,正則表達式就可以:

In [1]: import re                                                                                                                              

In [2]: haystack1 = "Foo, bar, USER ID bla bla bla You can - cheese"                                                                           

In [3]: haystack2 = "Foo, bar, USER FOO bla bla bla You can - cheese"                                                                          

In [4]: haystack3 = "Foo, bar, USER ID bla USER ID bla bla You can foo You can - cheese"                                                       

In [5]: for haystack in (haystack1, haystack2, haystack3):
   ...:     m = re.search(r'USER ID.+?You can', haystack)
   ...:     if m:
   ...:         print(haystack, "->", m.group(0))                                                                                              
   ...:     else:
   ...:         print(haystack, "->", "NO LUCK")
   ...:         
('Foo, bar, USER ID bla bla bla You can - cheese', '->', 'USER ID bla bla bla You can')
('Foo, bar, USER FOO bla bla bla You can - cheese', '->', 'NO LUCK')
('Foo, bar, USER ID bla USER ID bla bla You can foo You can - cheese', '->', 'USER ID bla USER ID bla bla You can')

如果您查看haystack 3 ,您將了解為什么它不會被遞歸字符串片段(如HTML / XML標記)剪切。

現在說明正則表達式: .+將匹配任何內容,點表示任何字符,加號表示一個或多個。 .+的問題在於它是“貪婪的”,它將匹配包括終止符字符串“ You can”在內的所有內容,直到字符串結尾。 所以我們必須添加? ,在此上下文中表示“不要貪婪”。 不要與結構x?混淆x? 這意味着零或一出現的“ x”。

[更新]

由於您使用多行示例更新了問題,因此可能必須包含re.DOTALL修飾符:

haystack = "Foo, bar\nUSER ID bla\n\t\nbla\nbla You can\n cheese"                                                                           
m = re.findall(r'USER ID.+?You can', haystack, re.DOTALL)                                                                        
if m:
    print(haystack, "->", m)
else:
    print(haystack, "->", "NO LUCK")

re.DOTALL修飾符意味着該點將匹配任何內容,包括行尾字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM