python中星号如何将中文替换为星号

后使用快捷导航没有帐号?
查看: 2360|回复: 16
提个简单的问题,正则表达式中关于’+‘和 星号
高级会员, 积分 938, 距离下一级还需 62 积分
论坛徽章:3
wenti.png (12.58 KB)
15:37 上传
这个用来查找连续的ad,为什么用+可以,用×号返回的是空呢?
金牌会员, 积分 1720, 距离下一级还需 1280 积分
论坛徽章:8
高级会员, 积分 938, 距离下一级还需 62 积分
论坛徽章:3
金牌会员, 积分 1666, 距离下一级还需 1334 积分
论坛徽章:28
&&& p=re.compile('(ad)*')
&&& m=p.search('sfadfdadfdfdad')
&&& m.group()
&&& m.groups()
&&& p=re.compile('(ad)*?')
&&& m=p.search('sfadfdadfdfdad')
&&& m.group()
&&& m.groups()
&&& p=re.compile('(ad)')
&&& m=p.search('sfadfdadfdfdad')
&&& m.group()
&&& p=re.compile(r'(?:ad)*')
&&& m=p.search('sfadfdadfdfdad')
&&& m.group()
&&& p=re.compile('((ad)*)?')
&&& m=p.search('sfadfdadfdfdad')
&&& m.group()
&&& print(p.findall('sfadadddfdfad'))
[('', ''), ('', ''), ('adad', 'ad'), ('', ''), ('', ''), ('', ''), ('', ''), ('', ''), ('ad', 'ad'), ('', '')]
虽然我没有找到答案。但是我觉得和下面这段话有关
数量词的贪婪模式与非贪婪模式正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式&ab*&如果用于查找&abbbc&,将找到&abbb&。而如果使用非贪婪的数量词&ab*?&,将找到&a&。
中级会员, 积分 465, 距离下一级还需 35 积分
论坛徽章:1
区别在于:
* 匹配0次或多次,如果首字符开始就不匹配,那么它满足条件就停止匹配;
+是匹配1次或多次,如果首字符不匹配,但后面字符可以匹配,它就会去匹配后面的,直到字符串尾部。除非1次都匹配不上,才返回空。但如果在中间碰上匹配不上的,也停止匹配。
虽然,它们有不同之处,但也有相同之处:如果满足匹配的条件(0次或1次),只要碰上匹配不上的字符就停止匹配。
你可以通过带有某些条件的字符串来验证下它们各自停止匹配的所满足的要求:
&&& p = re.compile('(ad)*')
&&& m = p.search('adsaasfdadad')&&
&&& m.group()&&# 满足条件“匹配多个(1个也算是多个)”,且碰上匹配不了的字符,那么停止匹配
&&& p = re.compile('(ad)*')
&&& m = p.search('adsaasfdadad')&&
&&& m.group()&&# 满足条件“匹配1个”,且后面碰上匹配不了的字符,就停止匹配
高级会员, 积分 938, 距离下一级还需 62 积分
论坛徽章:3
yiduawangkai 发表于
&&& p=re.compile('(ad)*')
&&& m=p.search('sfadfdadfdfdad')
&&& m.group()
我觉得不太对,请看下面这句话,在最后加入一个“$&一切就都正常了,为什么呢?
&&& p = re.compile('(ad)*$');
&&& m = p.search(&sfasfdfsadadadad&)
&&& m.group()
'adadadad'
高级会员, 积分 938, 距离下一级还需 62 积分
论坛徽章:3
jeff_nie 发表于
区别在于:
* 匹配0次或多次,如果首字符开始就不匹配,那么它满足条件就停止匹配;
+是匹配1次或多次,如 ...
我觉得不太对,请看6楼的程序,字符串并没有用&ad&开头。
金牌会员, 积分 1666, 距离下一级还需 1334 积分
论坛徽章:28
buxizhe 发表于
我觉得不太对,请看6楼的程序,字符串并没有用&ad&开头。
牛逼,考虑的好细致,
中级会员, 积分 465, 距离下一级还需 35 积分
论坛徽章:1
buxizhe 发表于
我觉得不太对,请看6楼的程序,字符串并没有用&ad&开头。
唉,加了$后,你让它从后面开始匹配当然能匹配到了,这和你不加$,但是首字符是ad开始的有什么区别?
那你考虑这种情况:
&&& p = re.compile('(ad)*$')
&&& m = p.search('adsfsfadad')
&&& m.group()
按你的正则表达式,那还不是首字符的ad也没有匹配到。原因在我上面的帖子里已经说过了。
高级会员, 积分 938, 距离下一级还需 62 积分
论坛徽章:3
jeff_nie 发表于
唉,加了$后,你让它从后面开始匹配当然能匹配到了,这和你不加$,但是首字符是ad开始的有什么区别?
dataguru.cn All Right Reserved.
扫一扫加入本版微信群PHP将部分内容替换成星号
在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上搜索了一下,看到有人是用substr_replace这个函数来替换的,后面我也用了这个函数,但在用的时候不是很好用。
一、substr_replace
先来看看这个函数的语法:
substr_replace(string,replacement,start,length)
string 必需。规定要检查的字符串。
replacement 必需。规定要插入的字符串。
必需。规定在字符串的何处开始替换。
  正数 - 在第 start 个偏移量开始替换
  负数 - 在从字符串结尾的第 start 个偏移量开始替换
  0 - 在字符串中的第一个字符处开始替换
可选。规定要替换多少个字符。
  正数 - 被替换的字符串长度
  负数 - 从字符串末端开始的被替换字符数
  0 - 插入而非替换
1、当start与charlist都为正数的时候,非常好理解,也很符号人的逻辑,start是从0开始的,如下图,根据条件,绿色的将是要被替换的元素
2、当start为负数,charlist为正数的时候,也挺好理解的
3、当start为正数,charlist为负数的时候,这个我一开始理解错了
4、当start为负数,charlist为负数的时候,有一个地方需要注意的就是:如果 start 是负数且 length 小于等于 start,则 length 为 0。这个坑挺容易踩到的
5、charlist为0的时候,就变成插入了,而不是替换,额。。。
用下来,我是感觉不是很顺手,虽然说满足我现在的需求还是可以的,但是如果将来需要一些扩展的话,耍起来挺吃力的,所以就想到自己构造一个,将来用起来也方便。
二、自制的星号替换函数
replaceStar($str, $start, $length = 0)
str 必需。规定要检查的字符串。
必需。规定在字符串的何处开始替换。
  正数 - 在第 start 个偏移量开始替换
  负数 - 在从字符串结尾的第 start 个偏移量开始替换
  0 - 在字符串中的第一个字符处开始替换
可选。规定要替换多少个字符。
  正数 - 被替换的字符串长度,从左往右
  负数 - 被替换的字符串长度,从右往左
  0 - 如果start为正数,从start开始向左到最后
   & - 如果start为负数,从start开始向右到最后
前面的两个参数与上面的一样,最后的参数与上面不同
1、当start与length都为正数,与substr_replace表现的一样
2、当start为负数,length为正数,与substr_replace表现的一样
substr_replace
replaceStar
start为正数,长度为负数
start为负数,长度为负数
&start为正数,长度为0 做插入操作
&start为负数,长度为0 做插入操作
public static function replaceStar($str, $start, $length = 0)
& & & & $i = 0;
& & & & $star = '';
& & & & if($start &= 0) {
& & & & & & if($length & 0) {
& & & & & & & & $str_len = strlen($str);
& & & & & & & & $count = $
& & & & & & & & if($start &= $str_len) {//当开始的下标大于字符串长度的时候,就不做替换了
& & & & & & & & & & $count = 0;
& & & & & & & & }
& & & & & & }elseif($length & 0){
& & & & & & & & $str_len = strlen($str);
& & & & & & & & $count = abs($length);
& & & & & & & & if($start &= $str_len) {//当开始的下标大于字符串长度的时候,由于是反向的,就从最后那个字符的下标开始
& & & & & & & & & & $start = $str_len - 1;
& & & & & & & & }
& & & & & & & & $offset = $start - $count + 1;//起点下标减去数量,计算偏移量
& & & & & & & & $count = $offset &= 0 ? abs($length) : ($start + 1);//偏移量大于等于0说明没有超过最左边,小于0了说明超过了最左边,就用起点到最左边的长度
& & & & & & & & $start = $offset &= 0 ? $offset : 0;//从最左边或左边的某个位置开始
& & & & & & }else {
& & & & & & & & $str_len = strlen($str);
& & & & & & & & $count = $str_len - $//计算要替换的数量
& & & & & & }
& & & & }else {
& & & & & & if($length & 0) {
& & & & & & & & $offset = abs($start);
& & & & & & & & $count = $offset &= $length ? $length : $//大于等于长度的时候 没有超出最右边
& & & & & & }elseif($length & 0){
& & & & & & & & $str_len = strlen($str);
& & & & & & & & $end = $str_len + $//计算偏移的结尾值
& & & & & & & & $offset = abs($start + $length) - 1;//计算偏移量,由于都是负数就加起来
& & & & & & & & $start = $str_len - $//计算起点值
& & & & & & & & $start = $start &= 0 ? $start : 0;
& & & & & & & & $count = $end - $start + 1;
& & & & & & }else {
& & & & & & & & $str_len = strlen($str);
& & & & & & & & $count = $str_len + $start + 1;//计算需要偏移的长度
& & & & & & & & $start = 0;
& & & & & & }
& & & & while ($i & $count) {
& & & & & & $star .= '*';
& & & & & & $i++;
& & & & return substr_replace($str, $star, $start, $count);
不擅长算法,这里就用很普通的逻辑来展示啦,没有用到啥数学公式。
1、if($start &= 0)这里做start大于等于0与小于0的分支
2、在start 的分之中,分别再做length 大于0,小于0和等于0的三个分支
3、最后计算出start、count和要替换的星号字符串,最后计算出的start与count都是正数,运用substr_replace做替换
四、单元测试
public function testReplaceStar()
& & & & $actual = App_Util_String::replaceStar('', 3, 2);
& & & & $this-&assertEquals($actual, '123**6789');
& & & & $actual = App_Util_String::replaceStar('', 9);
& & & & $this-&assertEquals($actual, '');
& & & & $actual = App_Util_String::replaceStar('', 9, 2);
& & & & $this-&assertEquals($actual, '');
& & & & $actual = App_Util_String::replaceStar('', 9, -9);
& & & & $this-&assertEquals($actual, '*********');
& & & & $actual = App_Util_String::replaceStar('', 9, -10);
& & & & $this-&assertEquals($actual, '*********');
& & & & $actual = App_Util_String::replaceStar('', 9, -11);
& & & & $this-&assertEquals($actual, '*********');
& & & & $actual = App_Util_String::replaceStar('', 3);
& & & & $this-&assertEquals($actual, '123******');
& & & & $actual = App_Util_String::replaceStar('', 0);
& & & & $this-&assertEquals($actual, '*********');
& & & & $actual = App_Util_String::replaceStar('', 0, 2);
& & & & $this-&assertEquals($actual, '**;);
& & & & $actual = App_Util_String::replaceStar('', 3, -3);
& & & & $this-&assertEquals($actual, '1***56789');
& & & & $actual = App_Util_String::replaceStar('', 1, -5);
& & & & $this-&assertEquals($actual, '**;);
& & & & $actual = App_Util_String::replaceStar('', 3, -3);
& & & & $this-&assertEquals($actual, '1***56789');
& & & & $actual = App_Util_String::replaceStar('', -3, 2);
& & & & $this-&assertEquals($actual, '');
& & & & $actual = App_Util_String::replaceStar('', -3, 5);
& & & & $this-&assertEquals($actual, '123456***');
& & & & $actual = App_Util_String::replaceStar('', -1, 2);
& & & & $this-&assertEquals($actual, '*');
& & & & $actual = App_Util_String::replaceStar('', -1, -2);
& & & & $this-&assertEquals($actual, '1234567**');
& & & & $actual = App_Util_String::replaceStar('', -4, -7);
& & & & $this-&assertEquals($actual, '******789');
& & & & $actual = App_Util_String::replaceStar('', -1, -3);
& & & & $this-&assertEquals($actual, '123456***');
& & & & $actual = App_Util_String::replaceStar('', -1);
& & & & $this-&assertEquals($actual, '*********');
& & & & $actual = App_Util_String::replaceStar('', -2);
& & & & $this-&assertEquals($actual, '********9');
& & & & $actual = App_Util_String::replaceStar('', -9);
& & & & $this-&assertEquals($actual, '*;);
& & & & $actual = App_Util_String::replaceStar('', -10);
& & & & $this-&assertEquals($actual, '');
& & & & $actual = App_Util_String::replaceStar('', -10, -2);
& & & & $this-&assertEquals($actual, '');Python的中文编码转换问题
与服务器进行数据交换时,尤其是数据中含有中文时,要注意中文的编码问题。要选择服务器接受的编码方式,否则会造成显示乱码。
实验室服务器的数据库,中文用UTF-8编码,但我提交的是GBK编码的中文,结果出现乱码:
于是借鉴了网上的代码,添加了自动转换指定编码的函数:
#Change encoding type
def chmod(mes, encoding ='utf-8'):
if isinstance(mes, unicode):
return mes.encode(encoding)
for c in ('utf-8', 'gbk', 'gb2312', 'gb18030', 'utf-16'):
if encoding == 'unicode':
return mes.decode(c)
return mes.decode(c).encode(encoding)
raise 'Unknown charset'
基本能解决大陆上的编码问题。
简单解释一下:
首先判断传入的mes是否是unicode编码,若是,直接encode成目标编码;
然后分别用utf-8, gbk, gb2312, gb18030, utf-16尝试解码,若解码不成功,程序抛出异常,跳到except中,进行下一个编码尝试;
若解码成功,则encode成目标编码,函数返回;
若五个编码方式都抛出了异常,则抛出异常“Unknown charset”。
但该代码有一个bug,并没有对用户的输入的编码方式encoding进行过滤,若用户误输入,则也会抛出‘Unknown charset’异常。
参考资料:
Python 中使用 string-escape 将带转义的字节码字符串转换为 utf-8 字符串
没有更多推荐了,Python敏感词替换成* - 简书
Python敏感词替换成*
敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用星号 * 替换,例如当用户输入“北京是个好城市”,则变成“**是个好城市”。
filtered_words.txt:
filtered_words.txt
#-*-coding: utf-8-*-
class Input(object):
def __init__(self):
self.filtered_words = list()
self.in_string = ''
self.out_string = ''
self.load_filtered_words()
def load_filtered_words(self, filename='filtered_words.txt'):
with open(filename, 'r') as file:
for line in file.readlines():
self.filtered_words.append(line.strip())
def filter_words(self):
self.out_string = self.in_string
for word in self.filtered_words:
if word in self.out_string:
self.out_string = self.out_string.replace(word, len(word)*'*')
def user_input(self, filename):
if not filename:
self.in_string = input('&')
with open(filename, 'r') as f:
self.in_string = f.read()
def std_output(self):
self.filter_words()
print(self.out_string)
if __name__ == '__main__':
i = Input()
i.user_input('')
i.std_output()
运行结果:
If you keep on believing,
the dreams that you wish will come true.
1. 题目 第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights。 第 0012 题: 敏感词文本文件 filtered_words.txt,里面...
第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」。
一些网站: http://30daydo.com/topic/ http://www.openbookproject.net/py4fun/ http://learnpythonthehardway.org/ Python 练习册,每天一个小程序 说明: Python 练习...
题目来自:Python 练习册。题目1.7:敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights。 查看更多于本人博客:iii.run Python find()方法...
1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个&.java&源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个publ...
前两天,听了赵周老师的分答小讲,感受颇多,写个文章,予己予人 帮主用了大量篇幅,讲了一件事:分析整理信息,为知识添加上下文一个知识点,之所以为点,是因为没有建立起连接。一堆沙子,一阵风便可以灰飞烟灭,而和成泥,抹成灰,便可成屹立千年之塔。如何建立知识的连接呢?前因后果,适用...
巴山寒雨淅淅梦 几度风霜历历新 万里踏歌荒烟处 一朝梦尽帝城花 各棹烟波千万里 江水冷暖唯自知 莫笑青衫远谪人 吾心安处便是真
一 茅泰一家子昨天也就是周六给他父亲办了一场生日宴会。 其实他父亲真正的生日并非这一天,是他母亲一时兴起说要定在这天。于是,他们也就孝顺地照办了。 生日宴会的一切活动都在家里进行。这也是他妈决定的。 茅泰这阵遭遇好些事,忙得有些喘不过气来了。原打算将部分内容比...
那是多年以前的事了吧,我趴着在桌上,看着那张照片,不禁想到,各位同学应该都作鸟兽散了吧,不知道你们都在那儿,过得怎样,慢慢,莹,小黄,家乐,都还好吗
董威,一个在这中策职高的学霸,中考落榜,来到这美丽的大中策,心中难免有些不爽,只因中考时志愿表报的太高,结果高中...}

我要回帖

更多关于 python打印星号三角形 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信