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

时间:2020-09-20 12:43:51

标签: python regex

我有输入文字:

with open('from_file.mp3', 'wb') as ff:
    tts1.write_to_fp(ff)
    tts2.write_to_fp(ff)  

os.system("from_file.mp3")

下面是使用的代码

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.']

因此您可以看到输出1和2都缺少我的小东西

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

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

3 个答案:

答案 0 :(得分:3)

对于第一个模式,如果右边是空格,则可以使用交替来匹配-,而正向先行则可以使用[

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

Regex demo


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

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

Regex demo

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

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

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

Regex demo


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

答案 1 :(得分:1)

我喜欢使用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。] +

您应该发现它范围很广,甚至可以使用更多示例。

答案 2 :(得分:1)

首先,您需要稍作调整。您需要将\s留在后面#p>

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

但这会产生:

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

由于lookbehind绝不是匹配项的一部分,因此无法获得“-”作为返回列表的第三个值。您希望在最终-匹配项中输入的字符串中的第三个findall在以下上下文中:

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

在这种情况下返回''的正则表达式可以很好地指示输入字符串中带有对应的空[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)