正则表达式
30分钟正则表达式
python中对于正则表达式使用re模块处理
因为python本身也用转义,所以可以在字符串前使用r前缀,这样就不用考虑转义问题了。
match()
match()方法判断是否匹配成功,然会一个match()对象,否则返回None。
import re
test = '字符串'
if re.match(r'正则表达式',test):
print('ok')
else:
print('failed')
split()
re模块中的split([正则表达式],[字符串])方法可以使用正则表达式分割字符串,返回值为分割后的字符串字典。
()括号分组
使用()
可以提取分组,^(d{3})-(d{3,8})$
前后为两个组,可以直接从匹配后的字符串中提取出两部分内容。
如果正则表达式中定义了组,那么就可以在match()对象中使用group()方法提取字符串。
group(0)为源字符串,group(1)为第一个子串,group(2)为第二个子串。
compile()
如果一个正则表达式需要重复使用,那么应该预编译该正则表达式。
re.compile([正则表达式])方法用于预编译正则表达式。
多线程
任何进程默认都会启动一个线程,这个线程被称为主线程,主线程又可以启动新的线程。
threading模块中的current_thread()函数,永远返回当前线程的实例。主线程实例的名字为MainThread
,子线程的名字在创建时指定。名字没啥意义,就是需要的时候可以打印出来。
Lock
多进程中,同一个变量,各自有一份拷贝存在于每个进程中;多线程中,所有变量都由所有线程共享。
所以为了避免多个线程使变量错乱,需要给线程加锁,防止线程之间修改出现冲突。当一个线程获得锁之后,其他线程就不能同时执行该线程运行中的方法,只能等待锁被释放后才可以更改。无论多少线程,同一时刻只有一个线程持有该锁,所以不会造成修改的冲突。
threading模块中的lock()方法可以创建一个锁。
lock = threading.Lock()
def run_thread(n):
for i in range(100000):
# 先要获取锁:
lock.acquire()
try:
# 放心地改吧:
change_it(n)
finally:
# 改完了一定要释放锁:
lock.release()
锁在用完后一定要释放,否则其他线程将会变成死线程。
多线程编程时,模型复杂,容易发生冲突,必须加锁隔离线程,同时也要小心死锁。
python解释器设计时有GIL全局锁,所以python多线程无法利用多核。
ThreadLocal
import threading
local_school = threading.local()
def process_student():
std = local_school.student
print('hello %s (in %s)' % (std,threading.current_thread().name))
def process_thread(name):
local_school.student = name
process_student()
t1 = threading.Thread(target=process_thread,args=('Lihua',),name='线程A')
t2 = threading.Thread(target=process_thread,args=('Hanmeimei',),name='线程B')
t1.start()
t2.start()
t1.join()
t2.join()
一个ThreadLocal变量虽然是全局变量,但是每个线程都只能操作自己线程内的变量副本,互不干扰。就像班里的点名簿,每个班都有可能有一个叫李华的同学,但是每个班在点名时点的是本班的李华,和其他班的重名同学不是一个人。