整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python中过滤字符串列表的方法

Python中过滤字符串列表的方法

ython使用列表数据类型在顺序索引中存储多个数据。它的工作方式类似于其他编程语言的数字数组。filter()方法是Python的一种非常有用的方法。可以使用filter()方法从Python中的任何字符串、列表或字典中过滤一个或多个数值。它根据任何特定条件过滤数据。当条件返回true时,它将存储数据,而返回false时将丢弃数据。本文通过使用不同的示例展示了如何在Python中过滤列表中的字符串数据。您必须使用Python 3+来测试本文的示例。

使用另一个列表过滤字符串列表

本示例说明了如何在不使用任何方法的情况下过滤字符串列表中的数据。 字符串列表在此使用另一个列表进行过滤。 在此,声明了两个列表变量,名称分别为list1和list2。 使用list1的值过滤list2的值。 该脚本会将list2的每个值的第一个单词与list1的值进行匹配,并打印list1中不存在的那些值。

#coding=utf-8

# 声明两个列表变量

list1=['Python', 'PHP', 'Java', 'Bash']

list2=['JavaScript是客户端脚本语言',

'PHP是服务器端脚本语言',

'Java是一种编程语言',

'Kotlin是一种静态编程语言']

# 根据第一个列表过滤第二个列表

filter_data=[x for x in list2 if

all(y not in x for y in list1)]

# 在过滤前和过滤后打印列表数据

print("第一个列表的内容:", list1)

print("第二个列表的内容:", list2)

print("过滤后的第二个列表的内容:", filter_data)

运行脚本。 在此,list1不包含单词“Kotlin”。 输出将仅包含list2中的一个值,即 ['Kotlin是一种静态编程语言']。

如何在Python中过滤字符串列表

输出如下:

第一个列表的内容: ['Python', 'PHP', 'Java', 'Bash']
第二个列表的内容: ['JavaScript是客户端脚本语言', 'PHP是服务器端脚本语言', 'Java是一种编程语言', 'Kotlin是一种静态编程语言']
过滤后的第二个列表的内容: ['Kotlin是一种静态编程语言']

使用另一个列表和自定义函数过滤字符串列表

本示例说明如何使用另一个列表和自定义过滤器功能过滤字符串列表。 该脚本包含两个名为list1和list2的列表变量。 自定义过滤器功能将找出两个列表变量的公共值。

# 声明两个列表变量

list1=['100', '67', '39', '505', '122', '287', '399']

list2=['70', '100', '308', '415', '362', '230']

# 声明一个函数来过滤第一个列表中的数据

def Filter(list1, list2):

return [n for n in list1 if

any(m in n for m in list2)]

# 在过滤器之前和之后打印列表数据

print("list1的的内容:", list1)

print("list2的的内容:", list2)

print("过滤后的数据",Filter(list1, list2))

运行脚本。 两个列表变量中都存在100的值。 运行脚本后,将生成以下输出。

list1的的内容: ['100', '67', '39', '505', '122', '287', '399']
list2的的内容: ['70', '100', '308', '415', '362', '230']
过滤后的数据 ['100']

使用正则表达式过滤字符串列表

通过使用前两个示例中的all()和any()方法来过滤列表。 在此示例中,使用正则表达式从列表中过滤数据。 正则表达式是一种模式,通过该模式可以搜索或匹配任何数据。 Python中使用're'模块在脚本中应用正则表达式。 在此,使用主题代码声明列表。 正则表达式用于过滤以“ CSE”开头的主题代码。 正则表达式模式中使用'^'符号在文本的开头进行搜索。

# 导入re模块以使用正则表达式

import re

# 声明列表包含科目编号

sublist=['IDC-108', 'OKY-309', 'IDC-709', 'PHP-102', 'MIO-801']

# 声明过滤功能

def Filter(datalist):

# 根据列表中的正则表达式搜索数据

return [val for val in datalist

if re.search(r'^IDC', val)]

# 打印过滤器数据

print(Filter(sublist))

运行脚本。 子列表变量包含两个以“IDC”开头的值。 运行脚本后,将显示以下输出。

['IDC-108', 'IDC-709']

使用lamda表达式过滤字符串列表

本示例说明了使用lamda表达式从字符串列表中过滤数据。 在这里,名为search_word的列表变量用于从名为text的文本变量中过滤内容。 通过使用split()方法,基于空间将文本内容转换为名为text_word的列表。 lamda表达式将忽略text_word中存在于search_word中的那些值,并通过添加空格将过滤后的值存储在变量中。

# 声明一个包含linuxidc_word中关键词的列表

linuxidc_word=["系统", "linuxidc", "Python", "Kotlin"]

# 定义文本,从列表中搜索单词

text="Linux公社 linuxidc 是专业的 Linux 系统 门户网站,实时发布 最新 Kotlin 资讯!"

# 根据空格分割文本并将单词存储在列表中

text_word=text.split()

# 使用lambda表达式过滤数据

filter_text=' '.join((filter(lambda val: val not in linuxidc_word, text_word)))

# 在过滤前和过滤后打印文本

print("\n过滤前的文本:\n", text)

print("过滤后的文本:\n", filter_text)

运行脚本。 运行脚本后,将显示以下输出。

过滤前的文本:
Linux公社 linuxidc 是专业的 Linux 系统 门户网站,实时发布 最新 Kotlin 资讯!
过滤后的文本:
Linux公社 是专业的 Linux 门户网站,实时发布 最新 资讯!

使用filter()方法过滤字符串列表

filter()方法接受两个参数。 第一个参数采用函数名称或“ None”,第二个参数采用列表变量的名称作为值。 filter()方法如果返回true,则从列表中存储这些数据,否则将丢弃该数据。 在此,第一个参数值不指定任何值。 所有不为false的值将从列表中检索为已过滤数据。

#声明混合数据列表

listData=['linuxidc', 90, 9, 'com', 100, False, 22, True, '1']

# 使用None和列表调用filter()方法

filteredData=filter(None, listData)

#过滤数据后打印列表

print('过滤后的列表:')

for val in filteredData:

print(val)

运行脚本。该列表只包含一个false值,在过滤后的数据中将省略该false值。

总结:

当您需要从列表中搜索和检索特定值时, 过滤非常有用。我希望上面的例子能帮助读者理解从字符串列表中过滤数据的方法。

里主要是介绍下防止XSS的时机判断,让你明白XSS实质应该防止的位置

什么是XSS攻击

它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS是黑客,恶意用户常用的注入漏洞,也是网站安全要考虑的问题

以Think PHP3.2框架为例

框架为了防止XSS(跨站脚本, cross site script)危害. 用户通过script脚本, 控制web页面的行为. 采用的策略: 在接收到浏览器端数据后, 将数据转换为HTML实体编码

这是框架的默认策略, 很low, 现在几乎不用该策略

在接收数据时, 就完成实体编码转换. 主要的问题, “数据库中存储的不在是原始数据了. 而是处理过之后的数据”.

html实体编码后的数据

目前的策略是:

在数据输出到页面时, 才进行html实体编码转换.

都是使用HTML实体编码转换, 但是, 时机不同. 合理的策略是输出时. 而不是输入时.

原因: script脚本, 只有在浏览器端运行, 才有执行意义. 存储在数据库中,没有任何危害!

数据库中不知道用户到底真正输入的是什么!

方案:

关闭, 输入时, 自动实体编码处理

将默认的过滤器关掉

将过滤方法默认为空

输出时, 对可能发生的注入字段, 进行过滤:

模板中完成:

在需要的字段文章添加过滤

效果:

数据中, 存储的是原始数据, 未转换编码的数据

保存的是原始数据

输出时, 数据为实体编码:

详细讲解太长,再简单说一下对于Html编辑器的XSS的处理 应该是另一个方式

原因:

其他字段, title字段, 输出时, 直接转换为实体标记即可.

但是, 对于描述这种html编辑器的内容. 输出时不能直接转换. 因为 html代码, 对于数据是有意义的.

处理方案: 将内容中的script部分, 转换成实体. 非script部分, 不去处理.

实现:

自定义一个过滤器函数

使用正则替换实现,只对script标签进行处理

定义成一个方法,再需要选择的时候选用该函数

结果

数据库中的数据:

输出时:

本文主要是介绍XSS防止时机,更多相关资料可以联系

实现 HTML 压缩,可以使用 JavaScript 中的正则表达式来去除 HTML 中的空格和注释。以下是一个简单的 HTML 压缩函数:

function compressHTML(html) {
  // 去除注释
  html=html.replace(/<!--[\s\S]*?-->/g, "");
  // 去除多余空白
  html=html.replace(/\s+/g, " ");
  // 去除标签之间空格
  html=html.replace(/>\s+</g, "><");
  return html.trim();
}

该函数首先使用正则表达式去除 HTML 中的注释。然后,它使用另一个正则表达式去除 HTML 中的多余空格。最后,它使用另一个正则表达式去除标签之间的空格。

为了测试该函数,您可以创建一个 HTML 文件,并在其中添加一些冗余的空格和注释。例如:

<!DOCTYPE html>
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <!-- This is a comment -->
    <h1> Welcome to my website! </h1>
    <p> This is some text. </p>
  </body>
</html>

然后,您可以在Node.JS中使用以下代码将 HTML 文件加载为字符串并压缩它:

// 加载 HTML 文件
const fs=require("fs");
const html=fs.readFileSync("index.html", "utf8");
// 压缩 HTML
const compressedHtml=compressHTML(html);
console.log(compressedHtml);

输出是一个压缩后的 HTML 字符串,其中不包含注释或冗余空格。

或者直接在IE中测试,代码如下:

function compressHTML(html) {
  // 去除注释
  html=html.replace(/<!--[\s\S]*?-->/g, "");
  // 去除多余空白
  html=html.replace(/\s+/g, " ");
  // 去除标签之间空格
  html=html.replace(/>\s+</g, "><");
  return html.trim();
}
var html=`
<!DOCTYPE html>
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <!-- This is a comment -->
    <h1> Welcome to my website! </h1>
    <p> This is some text. </p>
  </body>
</html>
`;
console.log(compressHTML(html));

运行效果: