Python 如何使用regex识别论坛上不同人的帖子?
我试图用正则表达式来识别不同学生的帖子 这些职位的形式总是: “U3951583\n您好,我叫哈里。退房 。这是我的网站。\n U39501492\n这是一个 很酷的网站。\n U5235098\n我也来看看“Python 如何使用regex识别论坛上不同人的帖子?,python,regex,python-3.x,Python,Regex,Python 3.x,我试图用正则表达式来识别不同学生的帖子 这些职位的形式总是: “U3951583\n您好,我叫哈里。退房 。这是我的网站。\n U39501492\n这是一个 很酷的网站。\n U5235098\n我也来看看“ 因此,学生id的长度可以是7-8个数字 学生们可以发帖 任何东西单词、数字、标点符号等 我们不知道有多少 将有多少人的职位 我如何使用regex创建一个列表,其中的元素是每个学生按其发布顺序发布的帖子 学生们可以发布任何东西,所以我用[\s\s]+来捕捉。我的尝试是:re.findall
re.findall('(U\d+\n[\s\s]+?),text)
。但是,这只返回学生的ID而不是他们的文本:['U3951583\n','U39501492\n','U5235098\n']
在这种情况下如何使用正则表达式匹配?尝试使用此正则表达式:
\d{7,8}
祝你好运 您可以使用
re.findall
方法:
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"]
见
分别获取名称和内容的变体:
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()))
输出:
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
看
使用的正则表达式是
\b(U\d{7,8})\b(.*?)(?=\bU\d{7,8}\b|\Z)
见
详细信息
-单词边界(当前位置的左侧不能立即出现字母/数字/\b
)\u
-第1组:(U\d{7,8})
和7或8位数字U
-单词边界\b
-第2组:任何0+字符,尽可能少(.*)
-一种正向前瞻,要求上述模式(名称模式)立即位于当前位置的右侧或((?=\bU\d{7,8}\b |\Z)
)字符串的结尾(|
)\Z
re.split
:
>>> 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"]
因此,如果您不需要单独获取名称和内容,这可能是一种更简单的方法。您可以匹配U和7-8位数字,然后是不以相同模式开头的行
\bU\d{7,8}(?:\r?\n(?![ ]*U\d{7}).*)*
解释
单词边界,匹配U,后跟7-8位数字\bU\d{7,8}
非捕获组(?:
匹配换行符\r?\n
负前瞻,断言右边的不是(?!
匹配0+次空格,后跟单词边界、U和7位数字[]*\bU\d{7}
关闭反向前瞻并匹配任何字符0+次).*
关闭非捕获组并重复0多次以匹配以下所有行)*
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))
结果
["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"]
|Python的确切版本是什么?Python 3.6.8(默认值,2019年1月14日,11:02:34)可能是您的非贪婪匹配模式不够贪婪。请检查下面的答案,并告知是否有适合您的方法,或者,如果您需要更多帮助/澄清。@AbdulNiyasPM已添加所有解释。请在重新拆分示例中解释(?!^)好吗?@SarahHolder
(?!^)
=不在字符串开头