字符串处理概述

工作中有时会对各类文本进行处理。文本,即字符串。
大部分使用正则表达式,部分直接使用python自带的方法

1. 替换字符串中的url

用于http,https和其他普通的url类型特殊字符

import re
def remove_urls (vTEXT):
    vTEXT = re.sub(r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '', vTEXT, flags=re.MULTILINE)
    return(vTEXT)


print( remove_urls("this is a test https://sdfs.sdfsdf.com/sdfsdf/sdfsdf/sd/sdfsdfs?bob=%20tree&jef=man lets see this too https://sdfsdf.fdf.com/sdf/f end"))

2. 替换字符串中的英文字母(不含标点符号)

import re
str="我aksjnekljfklen,"
temp = re.sub('[a-zA-Z]','',str)
print(temp)

3. 某个字符串在文本中出现的位置

3.1 找到第一个出现的位置

word = '木叶'
str = '木叶飞舞之处,木叶的莲花'
index = str.find(word)

3.2 找到所有出现的位置

def find_all_(source,dest):

    length1,length2 = len(source),len(dest)
    dest_list = []
    temp_list = []
    if length1 < length2:
        return -1
    i = 0
    while i <= length1-length2:
        if source[i] == dest[0]:
            dest_list.append(i)
        i += 1
    if dest_list == []:
        return -1
    for x in dest_list:
        #print("Now x is:%d. Slice string is :%s"% (x,repr(source[x:x+length2])),end=" ")
        if source[x:x+length2] != dest:
            #print(" dest != slice")
            temp_list.append(x)
        # else:
        #     print(" dest == slice")

    for x in temp_list:
        dest_list.remove(x)
    return dest_list

4. 中文姓氏

可以用来匹配文本中的'x师傅'……
https://github.com/wainshine/Chinese-Names-Corpus

book = xlrd.open_workbook("./tools/Chinese_Family_Name(1k).xlsx")
sheet = book.sheet_by_index(0)
for r in range(1,sheet.nrows):
    family_name = sheet.cell(r,0).value
    name_list.append(family_name)

5. 中文人名

使用hanlp中带词性的分词,人名对应的pos为'nr'。但是这种方法,很多人名其实被分为了姓+两个字。

words = [_.toString() for _ in HanLP.segment(str)]
for item in words:
    word,pos = item.split('/')
    if pos == 'nr':
        str = str.replace(word,'')

6. 获取所有字母和数字

chars = string.ascii_letters + string.digits

7. 判断英文和数字,基于正则

import re
print(re.findall('.*r(.*)b.*', 'www.runoob.com'))

判断有数字:re.match(r'[+-]?\d+$', s) s 为数字, 返回数字位置 ,
                          not re.match(r'\d', s) 返回为True说明不含有数字
是否全是数字: word.isdigit()
判断有英文字符: re.match(r'[a-z]+',s) 返回小写字母位置
                                    re.match(r'[a-z]+',s,re.I) 对大小写敏感。返回字母位置
                                   not re.match(r'[a-z]+',s,re.I) 返回为True说明没有英文字符

判断字符串中是否含有数字,不包含数字则返回True

import re
parttern = re.compile("\d")
mystr = "1080p" # 包含数字,则返回False
res = not re.match(parttern,mystr)
print(res)

8. 去掉所有标点符号,替换为空格。

import string
import re
regex = re.compile('[%s]' % re.escape(string.punctuation))
out = regex.sub(' ', text)

9. 去掉所有数字

在使用gensim计算文本相似度的时候,需要将字符串转换为单词组成的列表,此时,在转换过程中,去掉数字

 word_list = [word.strip() for word in words if word and not bool(re.search(r'\d', word))]

10 字符串和时间转换

import datetime
# str转时间格式:
dd = '2019-03-17 11:00:00'
dd = datetime.datetime.strptime(dd, "%Y-%m-%d %H:%M:%S")
print(dd,type(dd))

from datetime import datetime
def parse_ymd(s):
    year_s, mon_s, day_s = s.split('-')
    return datetime(int(year_s), int(mon_s), int(day_s))

# 时间格式转str:
dc = dd.strftime("%Y-%m-%d %H:%M:%S")
print(dc,type(dc))
posted @ 2020-09-08 10:55  木叶流云  阅读(246)  评论(0编辑  收藏  举报