Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用regex识别论坛上不同人的帖子?_Python_Regex_Python 3.x - Fatal编程技术网

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

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

我试图用正则表达式来识别不同学生的帖子

这些职位的形式总是:

“U3951583\n您好,我叫哈里。退房 。这是我的网站。\n U39501492\n这是一个 很酷的网站。\n U5235098\n我也来看看“

  • 因此,学生id的长度可以是7-8个数字
  • 学生们可以发帖 任何东西单词、数字、标点符号等
  • 我们不知道有多少 将有多少人的职位
  • 我如何使用regex创建一个列表,其中的元素是每个学生按其发布顺序发布的帖子

    学生们可以发布任何东西,所以我用[\s\s]+来捕捉。我的尝试是:
    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
    • (U\d{7,8})
      -第1组:
      U
      和7或8位数字
    • \b
      -单词边界
    • (.*)
      -第2组:任何0+字符,尽可能少
    • (?=\bU\d{7,8}\b |\Z)
      -一种正向前瞻,要求上述模式(名称模式)立即位于当前位置的右侧或(
      |
      )字符串的结尾(
      \Z
    Python 3.7+

    在最新的Python版本中,您可以使用与空字符串匹配的模式
    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}).*)*
    
    解释

    • \bU\d{7,8}
      单词边界,匹配U,后跟7-8位数字
    • (?:
      非捕获组
      • \r?\n
        匹配换行符
      • (?!
        负前瞻,断言右边的不是
        • []*\bU\d{7}
          匹配0+次空格,后跟单词边界、U和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
    (?!^)
    =不在字符串开头