1、Python正则表达式
参考文档:Python 正则表达式(RegEx)
2、re.sub(pattern, repl, string, count=0, flags=0)
Python中实现正则表达式提取替换,需要使用re.sub()
,具体参数说明如下:
1)pattern参数
pattern是正则表达式字符串。字符串前一般加r
。
参考文档:Python 字符串前r、b、u和f的前缀作用及用法
2)repl参数
repl
是被替换成的内容,可以是字符串,也可以是函数。字符串匹配后直接替换,函数则会每次匹配的字符串会调用执行进行处理。
3)string参数
string
表示要被处理,要被替换的字符串。
4)count参数
count
是匹配替换的次数
5)flags参数
IGNORECASE
(简写I
),匹配对大小写不敏感。
LOCALE
(简写L
),locales是C语言库中的一项功能,是用来为需要考虑不同区域语言的编程提供帮助的。
MULTILINE(
简写M
),^
匹配字符串的开始和字符串中每行的开始。同样的, $
元字符匹配字符串结尾和字符串中每行的结尾。
DOTALL
(简写S
),此模式下.
的匹配不受限制,可匹配任何字符,包括换行符,但默认是不能匹配换行符。
VERBOSE
(简写X
),冗余模式, 此模式忽略正则表达式中的空白和#号的注释。
3、使用re.sub()提取替换字符串
可以使用re.sub()
提取html中指定内容并进行替换,如下,
import re
def replace_num(str):
print("--------------")
print(str.group())
print(str.group(1))#匹配到的第1个分组
print(str.group(2))#匹配到的第2个分组
print("--------------")
return ""
my_str = '''
<p><strong>1、new 运算符</strong>:用于创建对象和调用构造函数。这个我们创建对象实例就比较常用了,比如:</p><pre class="prettyprint linenums"> StringBuilder str=new StringBuilder();</pre><p><strong>2、new 修饰符</strong>:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。简单的说,就是现在写的这个类,想写一个和基类中相同的成员,而不继承基类的。运用多态的特性时,也不会调用这个显示隐藏的方法。具体看下如下代码:</p><pre class="prettyprint linenums">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
public class Program
{
static void Main(string[] args)
{
animal a = new animal();
a.name = "animal";
a.say();
cat c = new cat();
c.name = "cat";
c.say();
dog d = new dog();
d.name = "dog";
d.say();
sheep s = new sheep();
s.name = "sheep";
s.say();
animal a1 = new cat();
a1.say();
animal a2 = new dog();
a2.say();
animal a3 = new sheep();
a3.say();
}
}
class animal
{
public string name { get; set; }
public virtual void say()
{
Console.WriteLine("animal say");
}
}
class cat : animal
{
public override void say()
{
Console.WriteLine("cat say");
}
}
class dog : animal
{
public new void say() //这个方法被显示隐藏了
{
Console.WriteLine("dog say");
}
}
class sheep : animal
{
}
}<br></pre><p><strong>3、new 约束</strong>:用于在泛型声明中约束可能用作类型参数的参数的类型。举个例子看一下,泛型类中T要求有一个无参的构造函数,代码如下,</p><pre class="prettyprint linenums">using System;<br>using System.Collections.Generic;<br>namespace ConsoleApplication2<br>{<br> public class Employee<br> {<br> private string name;<br> private int id;<br> public Employee()<br> {<br> name = "Temp";<br> id = 0;<br> }<br> public Employee(string s, int i)<br> {<br> name = s;<br> id = i;<br> }<br> public string Name<br> {<br> get { return name; }<br> set { name = value; }<br> }<br> public int ID<br> {<br> get { return id; }<br> set { id = value; }<br> }<br> }<br> class ItemFactory where T : new()<br> {<br> public T GetNewItem()<br> {<br> return new T();<br> }<br> }<br> public class Test<br> {<br> public static void Main()<br> {<br> ItemFactory EmployeeFactory = new ItemFactory();
//若没有则会有The Employee must have a public parameterless constructor 错误。
Console.WriteLine("{0}'ID is {1}.", EmployeeFactory.GetNewItem().Name, EmployeeFactory.GetNewItem().ID);<br> }<br> }<br>}</pre>
'''
result = re.sub(r'<pre class=\"prettyprint linenums\s*([a-z]*?)\"\s*>(.+?)</pre>', replace_num, my_str,flags=re.I|re.M|re.S)
print(result) #每次匹配一个数字,执行函数,获取替换后的值