首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用regex识别论坛上不同人的帖子?

如何使用regex识别论坛上不同人的帖子?
EN

Stack Overflow用户
提问于 2019-06-24 07:05:39
回答 3查看 91关注 0票数 4

我试着用regex识别不同学生的帖子。

这些职位的形式总是如下:

http://www.harryresume.com

  1. 所以学生id可以是7-8个数字。
  2. 学生们可以张贴任何东西。单词、数字、标点符号等。
  3. 我们不知道有多少帖子会有多少人。

我如何使用regex创建一个列表,其中的元素是每个学生的帖子,按其发布的顺序。

学生们可以发布任何东西,所以我用\s\S+来捕捉它。我的尝试是:re.findall('(U\d+\n[\s\S]+?)',text)。然而,这只返回学生的ID,而不是他们的文本:['U3951583\n ', 'U39501492\n ', 'U5235098\n ']

在这种情况下,如何使用regex匹配?

EN

回答 3

Stack Overflow用户

发布于 2019-06-24 07:10:30

您可以使用re.findall方法:

代码语言:javascript
复制
import re
txt = "U3951583\n Hi there my name is Harry. Check out http://www.harryresume.com. That's my website. \n U39501492\n That's a cool website. \n U5235098\n I'll have a look too"
print(re.findall(r'\bU\d{7,8}\b.*?(?=\bU\d{7,8}\b|\Z)', txt, re.S))
# => ["U3951583\n Hi there my name is Harry. Check out http://www.harryresume.com. That's my website. \n ", "U39501492\n That's a cool website. \n ", "U5235098\n I'll have a look too"]

Python演示

分别获取名称和内容的变体:

代码语言:javascript
复制
for name, content in re.findall(r'\b(U\d{7,8})\b(.*?)(?=\bU\d{7,8}\b|\Z)', txt, re.S):
    print("{}:{}".format(name.strip(), content.strip()))

输出:

代码语言:javascript
复制
U3951583:Hi there my name is Harry. Check out http://www.harryresume.com. That's my website.
U39501492:That's a cool website.
U5235098:I'll have a look too

请参阅这个Python演示

使用的正则表达式是

代码语言:javascript
复制
\b(U\d{7,8})\b(.*?)(?=\bU\d{7,8}\b|\Z)

regex演示

详细信息

  • \b -一个单词边界(不能立即在当前位置的左边显示字母/数字/_)
  • (U\d{7,8}) -第1组:U和7或8位数字
  • \b -一个单词边界
  • (.*?) -第2组:任何0+字符,尽可能少
  • (?=\bU\d{7,8}\b|\Z) --一种积极的前瞻性,它要求前面描述的模式(名称模式)立即位于当前位置或(|)字符串结束(\Z)的右侧。

Python 3.7+

在最新的Python版本中,您可以使用匹配空字符串的模式进行re.split

代码语言:javascript
复制
>>> import re
>>> txt = "U3951583\n Hi there my name is Harry. Check out http://www.harryresume.com. That's my website. 
\n U39501492\n That's a cool website. \n U5235098\n I'll have a look too"
>>> print(re.split(r'(?!^)(?=\bU\d{7,8}\b)', txt))
["U3951583\n Hi there my name is Harry. Check out http://www.harryresume.com. That's my website. \n ", "U3
9501492\n That's a cool website. \n ", "U5235098\n I'll have a look too"]

因此,如果您不需要分别获取名称和内容,这可能是一种更简单的方法。

票数 4
EN

Stack Overflow用户

发布于 2019-06-24 07:25:12

您可以匹配U和7-8位数,后面跟着不以相同模式开头的行。

代码语言:javascript
复制
\bU\d{7,8}(?:\r?\n(?![ ]*U\d{7}).*)*

解释

  • \bU\d{7,8}单词边界,匹配U,后面跟着7-8位数字
  • (?:非捕获群
    • \r?\n匹配换行符
    • (?!负前瞻,断言右边的不是
      • [ ]*\bU\d{7}匹配0+时,空格后面跟着单词边界,U和7位数

代码语言:javascript
复制
- `).*` Close negative lookahead and match any char 0+ times 

  • )*关闭非捕获组并重复0+次数以匹配以下所有行

例如

代码语言:javascript
复制
import re

s = "U3951583\n Hi there my name is Harry. Check out http://www.harryresume.com. That's my website. \n U39501492\n That's a cool website. \n U5235098\n I'll have a look too"
regex = r"\bU\d{7,8}(?:\r?\n(?![ ]*U\d{7}).*)*"

print(re.findall(regex, s))

结果

代码语言:javascript
复制
["U3951583\n Hi there my name is Harry. Check out http://www.harryresume.com. That's my website. ", "U39501492\n That's a cool website. ", "U5235098\n I'll have a look too"]

Regex演示 x- Python演示

票数 1
EN

Stack Overflow用户

发布于 2019-06-24 07:09:33

尝试使用以下正则表达式:

代码语言:javascript
复制
\d{7,8}

这里是Demo

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56731379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档