python正则表达式只获取两个字符串之间的数据

时间:2014-09-16 22:09:32

标签: python regex

我不确定如何在两个字符串之间获取第一个字符串或开始字符串" USER ID"和最后一个或结束的字符串"你可以"。

我想要一切,包括数字句号,特殊字符等。

但我也希望在保留的数据中包含两个字符串(这些开始和结束字符串代表我想要的数据)。

如何编写表达式以获取这些字符串之间的数据,同时还包括我的字符串作为结果的一部分?

看起来像什么

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:"以及所有内容,但不包括第二个单词"你可以"(我的情况)两个字符串可以是大写或小写。

所以我最终会得到很多:

Body: something
1. some question
you passed

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

1 个答案:

答案 0 :(得分:0)

只要它不是递归的,正则表达式就会这样做:

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标记)。

现在解释正则表达式:.+将匹配任何内容,点表示任何字符,加号表示一个或多个。问题.+是"贪婪",它会匹配任何内容,包括你的终结符字符串"你可以"直到字符串结束。所以我们必须添加?,在这种情况下,它意味着“不要贪婪”#34;不要与构造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修饰符表示该点将匹配任何内容,包括行尾字符。