PandasRegex模式需要一些清洁

2024-04-28 07:48:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个输入文本:

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中,当我们没有数据时,我缺少“-”符号,在第二个输出中,我无法读取“.”之后的最后一个单词

有人能推荐对代码进行必要的修改吗


Tags: textwebhttptargetservicevirtualdeletepost
3条回答

我喜欢使用Regex101.com来构建这样的正则表达式

请尝试以下方法

1.以下是更正的版本:https://regex101.com/r/bFDnSm/2

注意正则表达式改为

(?<=[-]\s)[a-zA-Z0-9]*

  1. 以下是更正的版本: https://regex101.com/r/4uLVUb/1

注意,正则表达式更改为:

[a-zA-Z]*\s/[a-zA-Z+/]+\s[A-Z]+/[0-9.]+

您应该发现这是相当广泛的,甚至应该与进一步的例子

首先,你需要稍微调整一下。您需要将\s与lookbehind合并

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

但这将产生:

['feest6811', 'kertzmann3129', '']

您无法将“-”作为返回列表的第三个值,因为lookback从来都不是匹配的一部分。您希望在最终findall匹配中使用的输入字符串中的第三个-位于以下上下文中:

156.127.178.177 - [21/Jun/2019:15:45:27 -0700] 

在本例中,返回“”的regex是一个很好的指示器,表明输入字符串中存在“-”,并且对应的空[a-zA-Z0-9]*子表达式匹配。如果真的让你烦恼,你可以:

user_name = re.findall('(?<=[-]\s)[a-zA-Z0-9]*', text)
user_name = ['-' if x == '' else x for x in user_name] # convert '' to '-'
print(user_name)

印刷品:

['feest6811', 'kertzmann3129', '-']

对于第二种用途:

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

对于第一个模式,您可以使用交替来匹配-,如果右侧是空格,则使用正向前瞻来匹配[

(?<=-\s)[a-zA-Z0-9]+|-(?= \[)

Regex demo


对于第二种模式,您可以使匹配更加具体,并根据需要进行扩展

(?:POST|DELETE) \S+ HTTP/(?:1\.[01]|2.0)

Regex demo

或者使用捕获组进行更广泛的匹配,捕获组将由re.findall返回,匹配大写字符,后跟/和开头双引号后面的字符a-zA-Z

不确定最后一个"是否丢失,但在这种情况下,您可以匹配它或断言字符串的结尾

"([A-Z]+\s/[a-zA-Z][^"]+)(?:"|$)

Regex demo


请参阅此Python demo以及所有3种模式的结果

相关问题 更多 >