猿问

熊猫正则表达式模式需要一些清洁

我有一个输入文本:


text = '146.204.224.152 - feest6811 [21/Jun/2019:15:45:24 -0700] "POST /incentivize HTTP/1.1" 302 4622\n197.109.77.178 - kertzmann3129 [21/Jun/2019:15:45:25 -0700] "DELETE /virtual/solutions/target/web+services HTTP/2.0" 203 26554\n156.127.178.177 - [21/Jun/2019:15:45:27 -0700] "DELETE /interactive/transparent/niches/revolutionize HTTP/1.1


output Required :['feest6811','kertzmann3129','-']


output getting :[ ' feest6811', ' kertzmann3129',' ']


下面是使用的代码


user_name = re.findall('(?<=[-])\s[a-zA-Z0-9]*',text)

第二个输出所需:


['POST /incentivize HTTP/1.1','DELETE /virtual/solutions/target/web+services HTTP/2.0','DELETE /interactive/transparent/niches/revolutionize HTTP/1.1']


Output getting :

['POST /incentivize HTTP/1.','DELETE /virtual/solutions/target/web+services HTTP/2.','DELETE /interactive/transparent/niches/revolutionize HTTP/1.']

以下是用于上述第二个输出的代码


request =  re.findall('[a-zA-Z]*\s/[a-zA-Z].*[.\+]',text)

正如你所看到的,我在输出 1 和 2 中都遗漏了一些小东西


在输出 1 中,当我们没有数据时,我缺少“-”符号,而在第二个输出中,我无法读取“.”之后的最后一个单词。


任何人都可以建议对代码进行必要的更改吗?


弑天下
浏览 1623回答 3
3回答

侃侃无极

-对于第一个模式,如果右侧是空格,则可以使用交替来匹配,并[使用正向前视。(?<=-\s)[a-zA-Z0-9]+|-(?= \[)正则表达式演示对于第二种模式,您可以使匹配更加具体,并根据需要进行扩展。(?:POST|DELETE) \S+ HTTP/(?:1\.[01]|2.0)正则表达式演示或者使用 re.findall 返回的捕获组进行更广泛的匹配,并匹配大写字符,后跟/左双引号后的字符 a-zA-Z。不确定最后一个"是否丢失,但在这种情况下,您可以匹配它或断言字符串的结尾。"([A-Z]+\s/[a-zA-Z][^"]+)(?:"|$)正则表达式演示

慕容3067478

首先,您需要稍微调整。你需要但是\s与lookbehinduser_name&nbsp;=&nbsp;re.findall('(?<=[-]\s)[a-zA-Z0-9]*',&nbsp;text) print(user_name)但这会产生:['feest6811',&nbsp;'kertzmann3129',&nbsp;'']您无法将“-”作为返回列表的第三个值,因为后视从来不是匹配的一部分。您想要在最终匹配中输入的第三个-&nbsp;输入字符串findall位于以下上下文中:156.127.178.177&nbsp;-&nbsp;[21/Jun/2019:15:45:27&nbsp;-0700]在本例中返回 '' 的正则表达式同样可以很好地指示输入字符串中是否存在 '-' 以及相应的空子[a-zA-Z0-9]*表达式匹配项。如果这确实困扰您,您可以随时这样做:user_name&nbsp;=&nbsp;re.findall('(?<=[-]\s)[a-zA-Z0-9]*',&nbsp;text) user_name&nbsp;=&nbsp;['-'&nbsp;if&nbsp;x&nbsp;==&nbsp;''&nbsp;else&nbsp;x&nbsp;for&nbsp;x&nbsp;in&nbsp;user_name]&nbsp;#&nbsp;convert&nbsp;''&nbsp;to&nbsp;'-' print(user_name)印刷:['feest6811',&nbsp;'kertzmann3129',&nbsp;'-']对于第二个使用:request&nbsp;=&nbsp;&nbsp;re.findall(r'[a-zA-Z]*\s/[a-zA-Z].*?/\d\.\d',&nbsp;text)

一只甜甜圈

我喜欢使用 Regex101.com 来构建这样的正则表达式。请尝试以下操作1.这是更正后的版本:https ://regex101.com/r/bFDnSm/2请注意正则表达式更改为(?<=[-]\s)[a-zA-Z0-9]*这是更正后的版本:&nbsp;https ://regex101.com/r/4uLVUb/1请注意正则表达式更改为:[a-zA-Z]*\s/[a-zA-Z+/]+\s[AZ]+/[0-9.]+您应该发现它非常广泛,甚至可以使用更多示例。
随时随地看视频慕课网APP

相关分类

Python
我要回答