欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

包含python求函數(shù)表達(dá)式的詞條

用Python3實(shí)現(xiàn)表達(dá)式求值

include malloc.h #include stdio.h #include ctype.h//判斷是否為字符的函數(shù)的頭文件 #define maxsize 100 typedef int elemtype; typedef struct sqstack sqstack;//由于sqstack不是一個(gè)類型 而struct sqstack才是 char ch[7]=;//把符號(hào)轉(zhuǎn)換成一個(gè)字符數(shù)組 int f1[7]=;//棧內(nèi)元素優(yōu)先級(jí) int f2[7]=;//棧外的元素優(yōu)先級(jí) struct sqstack { elemtype stack[maxsize]; int top; }; void Initstack(sqstack *s) { s-top=0; } void Push(sqstack *s,elemtype x) { if(s-top==maxsize-1) printf("Overflow\n"); else { s-top++; s-stack[s-top]=x; } } void Pop(sqstack *s,elemtype *x) { if(s-top==0) printf("underflow\n"); else { *x=s-stack[s-top]; s-top--; } } elemtype Gettop(sqstack s) { if(s.top==0) { printf("underflow\n"); return 0; } else return s.stack[s.top]; } elemtype f(char c) { switch(c) { case '+': return 0; case '-': return 1; case '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; default: return 6; } } char precede(char c1,char c2) { int i1=f(c1); int i2=f(c2);//把字符變成數(shù)字 if(f1[i1]f2[i2])//通過(guò)原來(lái)設(shè)定找到優(yōu)先級(jí) return ''; else if(f1[i1]f2[i2]) return ''; else return '='; } int Operate(elemtype a,elemtype theta,elemtype b) { int sum; switch(theta) { case 0: sum=a+b; break; case 1: sum=a-b; break; case 2: sum=a*b; break; default: sum=a/b; } return sum; } EvaluateExpression() { char c; int i=0,sum=0; int k=1,j=1;//設(shè)置了開(kāi)關(guān)變量 elemtype x,theta,a,b; sqstack OPTR,OPND; Initstack(OPTR); Push(OPTR,f('#'));//0壓入棧 Initstack(OPND); c=getchar(); if(c==ch[2]||c==ch[3]||c==ch[5]||c==ch[6])//先對(duì)+和-的情況忽略和左括號(hào)的情況 { printf("錯(cuò)誤1 \n"); k=0; return 0; } if(c==ch[0]) c=getchar();//如果是+,把它覆蓋 if(c==ch[1]) { j=0; c=getchar();//也把-號(hào)覆蓋 } while(c!='#'||ch[Gettop(OPTR)]!='#') { if(isdigit(c)) { sum=0; while(isdigit(c)) { if(!j) { sum=sum*10-(c-'0');//實(shí)現(xiàn)了數(shù)字串前面有負(fù)號(hào)(之前是:sum=-(sum*10)-(c-'0')結(jié)果是-12+13=21) } else sum=sum*10+(c-'0'); c=getchar(); } Push(OPND,sum);//如果還是數(shù)字先不壓棧,把數(shù)字串轉(zhuǎn)化成十進(jìn)制數(shù)字再壓棧 j=1; } else if(k) { switch(precede(ch[Gettop(OPTR)],c)) { case'': Push(OPTR,f(c));//把它們整型化 c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c=='\n')//要除去下個(gè)是‘(’的情況 也把以運(yùn)算符歸到這里來(lái) { printf("出錯(cuò)2\n"); k=0; return 0;//加了開(kāi)關(guān)變量和返回0的值使程序更以操作 } break; case'=': Pop(OPTR,x); c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c=='\n')//把ch[6]的情況也忽略了但此時(shí)并沒(méi)有注意到右括號(hào)后面右運(yùn)算符的情況 { printf("出錯(cuò)2\n"); k=0; return 0; } break; case'': Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a);//注意這里是誰(shuí)先出棧 Push(OPND,Operate(a,theta,b)); break; } } }//在這里判斷是否以運(yùn)算符結(jié)束是不對(duì)的 return(Gettop(OPND)); } main() { int result; printf("輸入你的算術(shù)表達(dá)式:\n"); result=EvaluateExpression(); printf("結(jié)果是 :%d\n",result); return 0; } : 本計(jì)算器利用堆棧來(lái)實(shí)現(xiàn)。 1、定義后綴式計(jì)算器的堆棧結(jié)構(gòu) 因?yàn)樾枰鎯?chǔ)的單元不多,這里使用順序棧,即用一維數(shù)組來(lái)模擬堆棧: #define MAX 100 int stack[MAX]; int top=0; 因此程序中定義了長(zhǎng)度為MAX的一維數(shù)組,這里MAX用宏定義為常數(shù)100,我們可以修改宏定義而重新定義堆棧的大小。 整型數(shù)據(jù)top為棧頂指示,由于程序開(kāi)始時(shí)堆棧中并無(wú)任何數(shù)據(jù)元素,因此top被初始化為0。 2、存儲(chǔ)后綴式計(jì)算器的運(yùn)算數(shù) 我們定義了堆棧stack[MAX]后,就可以利用入棧操作存儲(chǔ)先后輸入的兩個(gè)運(yùn)算數(shù)。 下面看一下是如何實(shí)現(xiàn)的: int push(int i) /*存儲(chǔ)運(yùn)算數(shù),入棧操作*/ { if(topMAX) { stack[++top]=i; /*堆棧仍有空間,棧頂指示上移一個(gè)位置*/ return 0; } else /*堆棧已滿,給出錯(cuò)誤信息,返回出錯(cuò)指示*/ { printf("The stack is full"); return ERR; } } 我們?cè)谡{(diào)用函數(shù)push時(shí),如果它的返回值為0,說(shuō)明入棧操作成功;否則,若返回值為ERR(在程序中說(shuō)明為-1),說(shuō)明入棧操作失敗。 3、從堆棧中取出運(yùn)算數(shù) 當(dāng)程序中讀完了四則運(yùn)算符后,我們就可以從堆棧中取出已經(jīng)存入的兩個(gè)運(yùn)算數(shù),構(gòu)成表達(dá)式,計(jì)算出結(jié)果。取出運(yùn)算數(shù)的函數(shù)采用的正是出棧算法。在本例中,實(shí)現(xiàn)該算法的函數(shù) 為pop(): int pop(); /*取出運(yùn)算數(shù),出棧操作*/ { int var; /*定義待返回的棧頂元素*/ if(top!=NULL) /*堆棧中仍有數(shù)據(jù)元素*/ { var=stack[top--]; /*堆棧指示下移一個(gè)位置*/ return var; } else /*堆棧為空,給出錯(cuò)誤信息,并返回出錯(cuò)返回值*/ printf("The stack is cmpty!\n"); return ERR; } 同樣,如果堆棧不為空,pop()函數(shù)返回堆棧頂端的數(shù)據(jù)元素,否則,給出棧空提示,并返回錯(cuò)誤返回值ERR。 4、設(shè)計(jì)完整的后綴式計(jì)算器 有了堆棧存儲(chǔ)運(yùn)算數(shù),后綴式計(jì)算器的設(shè)計(jì)就很簡(jiǎn)單了。程序首先提示用戶輸入第一個(gè)運(yùn)算數(shù),調(diào)用push()函數(shù)存入堆棧中;而后提示用戶輸入第二個(gè)運(yùn)算數(shù),同樣調(diào)用push()函數(shù)存入堆棧中。接下來(lái),程序提示用戶輸入+,-,*,/四種運(yùn)算符的一種,程序通過(guò)switch_case結(jié)構(gòu)判斷輸入運(yùn)算符的種類,轉(zhuǎn)而執(zhí)行不同的處理代碼。以除法為例,說(shuō)明程序的執(zhí)行流程: case '/': b=pop(); a=pop(); c=a/b; printf("\n\nThe result is %d\n",c); printf("\n"); break; 程序判斷用戶輸入的是除號(hào)后,就執(zhí)行上述代碼。首先接連兩次調(diào)用pop()函數(shù)從堆棧中讀出先前輸入的運(yùn)算數(shù),存入整型數(shù)a和b中;然后執(zhí)行除法運(yùn)算,結(jié)果存入單元c中。這時(shí)需要考慮究竟誰(shuí)是被除數(shù),誰(shuí)是除數(shù)。由于開(kāi)始我們先將被除數(shù)入棧,根據(jù)堆棧“先進(jìn)后出”的原則,被除數(shù)應(yīng)該是第二次調(diào)用pop()函數(shù)得到的返回值。而除數(shù)則是第一次調(diào)用pop()函數(shù)得到的返回值。 最后程序打印出運(yùn)算結(jié)果,并示提示用戶是否繼續(xù)運(yùn)行程序: printf("\t Continue?(y/n):"); l=getche(); if(l=='n') exit(0); 如果用戶回答是"n",那么結(jié)束程序,否則繼續(xù)循環(huán)。 完整的程序代碼如下: #includestdio.h #includeconio.h #includestdlib.h #define ERR -1 #define MAX 100 /*定義堆棧的大小*/ int stack[MAX]; /*用一維數(shù)組定義堆棧*/ int top=0; /*定義堆棧指示*/ int push(int i) /*存儲(chǔ)運(yùn)算數(shù),入棧操作*/ { if(topMAX) { stack[++top]=i; /*堆棧仍有空間,棧頂指示上移一個(gè)位置*/ return 0; } else { printf("The stack is full"); return ERR; } } int pop() /*取出運(yùn)算數(shù),出棧操作*/ { int var; /*定義待返回的棧頂元素*/ if(top!=NULL) /*堆棧中仍有元素*/ { var=stack[top--]; /*堆棧指示下移一個(gè)位置*/ return var; /*返回棧頂元素*/ } else printf("The stack is empty!\n"); return ERR; } void main() { int m,n; char l; int a,b,c; int k; do{ printf("\tAriothmatic Operate simulator\n"); /*給出提示信息*/ printf("\n\tPlease input first number:"); /*輸入第一個(gè)運(yùn)算數(shù)*/ scanf("%d",m); push(m); /*第一個(gè)運(yùn)算數(shù)入棧*/ printf("\n\tPlease input second number:"); /*輸入第二個(gè)運(yùn)算數(shù)*/ scanf("%d",n); push(n); /*第二個(gè)運(yùn)算數(shù)入棧*/ printf("\n\tChoose operator(+/-/*//):"); l=getche(); /*輸入運(yùn)算符*/ switch(l) /*判斷運(yùn)算符,轉(zhuǎn)而執(zhí)行相應(yīng)代碼*/ { case '+': b=pop(); a=pop(); c=a+b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '-': b=pop(); a=pop(); c=a-b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '*': b=pop(); a=pop(); c=a*b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '/': b=pop(); a=pop(); c=a/b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; } printf("\tContinue?(y/n):"); /*提示用戶是否結(jié)束程序*/ l=getche(); if(l=='n') exit(0); }while(1); } : #include stdio.h #include conio.h #include malloc.h #include stdlib.h #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; #define STACK_INIT_SIZE 100 //初始分配量 #define STACKINCREMENT 10 //存儲(chǔ)空間的分配增量 typedef char ElemType; typedef ElemType OperandType; //操作數(shù) typedef char OperatorType; typedef struct { ElemType *base; ElemType *top; int stacksize; }SqStack; Status InitStack(SqStack S) { //構(gòu)造一個(gè)空棧S S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status GetTop(SqStack S){ ElemType e; if (S.top == S.base) return ERROR; e = *(S.top-1); return e; } Status Push (SqStack S,ElemType e) { //插入元素e為新的棧頂元素 if (S.top - S.base = S.stacksize){ S.base = (ElemType *) realloc ( S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status Pop (SqStack S,ElemType e){ //若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR if(S.top == S.base) return ERROR; e = * --S.top; return OK; } char In(char c,char OP[]) { if(c=35 c=47) return 1; else return 0; } char OP[8]=; int m[7][7]={1,1,2,2,2,1,1, 1,1,2,2,2,1,1, 1,1,1,1,2,1,1, 1,1,1,1,2,1,1, 2,2,2,2,2,0,-1, 1,1,1,1,-1,1,1, 2,2,2,2,2,-1,0};//1 2 0 = -1 不存在 char Precede(char i,char j) { int a,b; char *p; for(p=OP,a=0;*p!='\0';p++,a++) if(*p==i) break; for(p=OP,b=0;*p!='\0';p++,b++) if(*p==j) break; if(m[a][b]==1) return ''; else if(m[a][b]==2) return ''; else if(m[a][b]==0) return '='; else return 'O'; } char Operate(char a,char theta,char b) { if(a47) a=atoi(a); if(b47) b=atoi(b); switch(theta) { case '+': return a+b; break; case '-': return a-b; break; case '*': return a*b; break; case '/': return a/b; break; } } OperandType EvaluateExpression() { SqStack OPTR,OPND; OperandType a,b,c; OperatorType theta; InitStack(OPTR); Push(OPTR,'#'); InitStack(OPND); c=getchar(); while (c!='#' || GetTop(OPTR)!='#') { if (!In(c,OP)) else switch(Precede(GetTop(OPTR),c)) { case '' : Push(OPTR,c); c = getchar(); break; case '=' : Pop(OPTR,c); c = getchar(); break; case '' : Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; } } return GetTop(OPND); } void main() { printf("(以#為結(jié)束符)\n"); printf("請(qǐng)輸入:\n"); int a; a=(int)EvaluateExpression(); printf("%d",a); getch(); } : ls都正確 : C++ In Action這本書(shū)里面有表達(dá)式求值的詳細(xì)項(xiàng)目分析. : 數(shù)據(jù)結(jié)構(gòu)的書(shū)里面都有的,仔細(xì)看一下 : studyall123的只能對(duì)0到9的數(shù)字運(yùn)算才有效,對(duì)于10以上的數(shù)字就不行!不知道有沒(méi)有更好的方法! : 現(xiàn)在的人,連google一下都懶啊 : 實(shí)際上是按照逆波蘭式的順序讓輸入的表達(dá)式入棧,再根據(jù)運(yùn)算符優(yōu)先級(jí)來(lái)計(jì)算。 : lenrning!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、赤峰網(wǎng)站維護(hù)、網(wǎng)站推廣。

python sympy 求表達(dá)式的值

Sympy是python中非常強(qiáng)大的符號(hào)運(yùn)算庫(kù),可以以書(shū)寫(xiě)習(xí)慣表示數(shù)學(xué)表達(dá)式。下面介紹用Sympy求方程數(shù)值解的方法。

下面代碼全部在

from sympy import *

init_printing(use_unicode=True) # 按書(shū)寫(xiě)習(xí)慣輸出

下運(yùn)行。

數(shù)學(xué)表達(dá)式的輸入

首先聲明符號(hào):

x = symbols('x')

即計(jì)算機(jī)中的變量x代表數(shù)學(xué)表達(dá)式中的x。在后文輸出中所有的x會(huì)顯示為x。如果x=symbols('x0'),則輸入的方程中所有x將在輸出中以x0表示。

如果需要希臘字母

l, r = symbol('lambda rho')

l, r將分別以λ,ρ表示。可以在一個(gè)表達(dá)式中同時(shí)聲明多個(gè)符號(hào)。

或者使用var()聲明:

var('x')

與上面等效。

聲明表達(dá)式:

f = (5/x)*(exp(x)-1)-exp(x)

此時(shí)若輸出f可以看到書(shū)寫(xiě)習(xí)慣的表達(dá)式。由于表達(dá)式在markdown下顯示不正常,在此不放置示例。注意f的類型是class 'sympy.core.add.Add'

求f(x)=0數(shù)值解

因?yàn)橛械暮瘮?shù)零點(diǎn)不止一個(gè),因此在Sympy中解的輸出為一個(gè)list。使用solve(表達(dá)式,自變量符號(hào))可以解析地解方程:

s, = solve(f, x)

這里根據(jù)上面f的賦值,得到s為

LambertW(-5e**-5)+5

其中用了特殊函數(shù)表達(dá)。

我們需要求這個(gè)結(jié)果的數(shù)值近似,則輸出

s.evalf()

得到輸出

4.96511423174428

就是方程f(x)=0的數(shù)值解。

求給定自變量x值時(shí)函數(shù)f(x)的值 | 將表達(dá)式轉(zhuǎn)化為函數(shù)

f.evalf(subs = {x:4.96})

得到f(4.96)的數(shù)值

0.141885450782171

如果需要以計(jì)算機(jī)函數(shù)的形式定義函數(shù)f(x),則可以使用lambdify()進(jìn)行轉(zhuǎn)化:

f_func = lambdify(x, f)

之后可以調(diào)用

f_func(4.96)

輸出

0.141885450782

利用這個(gè)方法可以測(cè)試方程的數(shù)值算法,如使用sympy接口寫(xiě)牛頓法等。

Python常用的正則表達(dá)式處理函數(shù)詳解

正則表達(dá)式是一個(gè)特殊的字符序列,用于簡(jiǎn)潔表達(dá)一組字符串特征,檢查一個(gè)字符串是否與某種模式匹配,使用起來(lái)十分方便。

在Python中,我們通過(guò)調(diào)用re庫(kù)來(lái)使用re模塊:

import re

下面介紹Python常用的正則表達(dá)式處理函數(shù)。

re.match函數(shù)

re.match 函數(shù)從字符串的起始位置匹配正則表達(dá)式,返回match對(duì)象,如果不是起始位置匹配成功的話,match()就返回None。

re.match(pattern, string, flags=0)

pattern:匹配的正則表達(dá)式。

string:待匹配的字符串。

flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等等。具體參數(shù)為:

re.I:忽略大小寫(xiě)。

re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境。

re.M:多行模式。

re.S:即 . ,并且包括換行符在內(nèi)的任意字符(. 不包括換行符)。

re.U:表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫(kù)。

re.X:為了增加可讀性,忽略空格和 # 后面的注釋。

import?re #從起始位置匹配 r1=re.match('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.match('def','abcdefghi') print(r2)

運(yùn)行結(jié)果:

其中,span表示匹配成功的整個(gè)子串的索引。

使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

group(num):匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號(hào),這時(shí)它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。

groups():返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。

import?re s='This?is?a?demo' r1=re.match(r'(.*)?is?(.*)',s) r2=re.match(r'(.*)?is?(.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())

運(yùn)行結(jié)果:

上述代碼中的(.*)和(.*?)表示正則表達(dá)式的貪婪匹配與非貪婪匹配。

re.search函數(shù)

re.search函數(shù)掃描整個(gè)字符串并返回第一個(gè)成功的匹配,如果匹配成功則返回match對(duì)象,否則返回None。

re.search(pattern, string, flags=0)

pattern:匹配的正則表達(dá)式。

string:待匹配的字符串。

flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等等。

import?re #從起始位置匹配 r1=re.search('abc','abcdefghi') print(r1) #不從起始位置匹配 r2=re.search('def','abcdefghi') print(r2)

運(yùn)行結(jié)果:

使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

group(num=0):匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號(hào),這時(shí)它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。

groups():返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。

import?re s='This?is?a?demo' r1=re.search(r'(.*)?is?(.*)',s) r2=re.search(r'(.*)?is?(.*?)',s) print(r1.group()) print(r1.group(1)) print(r1.group(2)) print(r1.groups()) print() print(r2.group()) print(r2.group(1)) print(r2.group(2)) print(r2.groups())

運(yùn)行結(jié)果:

從上面不難發(fā)現(xiàn)re.match與re.search的區(qū)別:re.match只匹配字符串的起始位置,只要起始位置不符合正則表達(dá)式就匹配失敗,而re.search是匹配整個(gè)字符串,直到找到一個(gè)匹配為止。

re.compile 函數(shù)

compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式對(duì)象,供 match() 和 search() 這兩個(gè)函數(shù)使用。

re.compile(pattern[, flags])

pattern:一個(gè)字符串形式的正則表達(dá)式。

flags:可選,表示匹配模式,比如忽略大小寫(xiě),多行模式等。

import?re #匹配數(shù)字 r=re.compile(r'\d+')? r1=r.match('This?is?a?demo') r2=r.match('This?is?111?and?That?is?222',0,27) r3=r.match('This?is?111?and?That?is?222',8,27) ? print(r1) print(r2) print(r3)

運(yùn)行結(jié)果:

findall函數(shù)

搜索字符串,以列表形式返回正則表達(dá)式匹配的所有子串,如果沒(méi)有找到匹配的,則返回空列表。

需要注意的是,match 和 search 是匹配一次,而findall 匹配所有。

findall(string[, pos[, endpos]])

string:待匹配的字符串。

pos:可選參數(shù),指定字符串的起始位置,默認(rèn)為0。

endpos:可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長(zhǎng)度。

import?re #匹配數(shù)字 r=re.compile(r'\d+')? r1=r.findall('This?is?a?demo') r2=r.findall('This?is?111?and?That?is?222',0,11) r3=r.findall('This?is?111?and?That?is?222',0,27) ? print(r1) print(r2) print(r3)

運(yùn)行結(jié)果:

re.finditer函數(shù)

和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。

re.finditer(pattern, string, flags=0)

pattern:匹配的正則表達(dá)式。

string:待匹配的字符串。

flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如是否區(qū)分大小寫(xiě),多行匹配等。

import?re? r=re.finditer(r'\d+','This?is?111?and?That?is?222') for?i?in?r:? ?print?(i.group())

運(yùn)行結(jié)果:

re.split函數(shù)

將一個(gè)字符串按照正則表達(dá)式匹配的子串進(jìn)行分割后,以列表形式返回。

re.split(pattern, string[, maxsplit=0, flags=0])

pattern:匹配的正則表達(dá)式。

string:待匹配的字符串。

maxsplit:分割次數(shù),maxsplit=1分割一次,默認(rèn)為0,不限次數(shù)。

flags:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫(xiě),多行匹配等。

import?re? r1=re.split('\W+','This?is?111?and?That?is?222')? r2=re.split('\W+','This?is?111?and?That?is?222',maxsplit=1)? r3=re.split('\d+','This?is?111?and?That?is?222')? r4=re.split('\d+','This?is?111?and?That?is?222',maxsplit=1)? print(r1) print(r2) print(r3) print(r4)

運(yùn)行結(jié)果:

re.sub函數(shù)

re.sub函數(shù)用于替換字符串中的匹配項(xiàng)。

re.sub(pattern, repl, string, count=0, flags=0)

pattern:正則中的模式字符串。

repl:替換的字符串,也可為一個(gè)函數(shù)。

string:要被查找替換的原始字符串。

count:模式匹配后替換的最大次數(shù),默認(rèn)0表示替換所有的匹配。

import?re? r='This?is?111?and?That?is?222' #?刪除字符串中的數(shù)字 r1=re.sub(r'\d+','',r) print(r1) #?刪除非數(shù)字的字符串? r2=re.sub(r'\D','',r) print(r2)

運(yùn)行結(jié)果:

到此這篇關(guān)于Python常用的正則表達(dá)式處理函數(shù)詳解的文章就介紹到這了,希望大家以后多多支持!

一文秒懂python正則表達(dá)式常用函數(shù)

01 Re概覽

Re模塊是python的內(nèi)置模塊,提供了正則表達(dá)式在python中的所有用法,默認(rèn)安裝位置在python根目錄下的Lib文件夾(如 ..\Python\Python37\Lib)。主要提供了3大類字符串操作方法:

字符查找/匹配

字符替換

字符分割

由于是面向字符串類型的模塊,就不得不提到字符串編碼類型。re模塊中,模式串和搜索串既可以是 Unicode 字符串 (常用str類型) ,也可以是8位字節(jié)串 (bytes,2位16進(jìn)制數(shù)字,例如\xe5) , 但要求二者必須是同類型字符串。

02 字符串查找/匹配

預(yù)編譯:compile

在介紹查找和匹配函數(shù)前,首先需要知道re的compile函數(shù),該函數(shù)可以將一個(gè)模式串編譯成正則表達(dá)式類型,以便后續(xù)快速匹配和復(fù)用

import?re pattern?=?re.compile(r'[a-z]{2,5}') type(pattern)?#re.Pattern

此例創(chuàng)建了一個(gè)正則表達(dá)式式對(duì)象 (re.pattern) ,命名為pattern,用于匹配2-5位小寫(xiě)字母的模式串。后續(xù)在使用其他正則表達(dá)式函數(shù)時(shí),即可使用pattern進(jìn)行方法調(diào)用。

匹配:match

match函數(shù)用于從文本串的起始位置開(kāi)始匹配,若匹配成功,則返回相應(yīng)的匹配對(duì)象,此時(shí)可調(diào)用group()方法返回匹配結(jié)果,也可用span()方法返回匹配起止下標(biāo)區(qū)間;否則返回None

import?re pattern?=?re.compile(r'[a-z]{2,5}') text1?=?'this?is?a?re?test' res?=?pattern.match(text1) print(res)?# if?res: ?print(res.group())?#this ?print(res.span())?#(0,?4) text2?=?'是的,?this?is?a?re?test' print(pattern.match(text2))#None

match函數(shù)還有一個(gè)變形函數(shù)fullmatch,當(dāng)且僅當(dāng)模式串與文本串剛好全部匹配時(shí),返回一個(gè)匹配對(duì)象,否則返回None

搜索:search

match只提供了從文本串起始位置匹配的結(jié)果,如果想從任意位置匹配,則可調(diào)用search方法,與match方法類似,當(dāng)任意位置匹配成功,則立即返回一個(gè)匹配對(duì)象,也可調(diào)用span()方法獲取起止區(qū)間、調(diào)用group方法獲得匹配文本串

import?re pattern?=?re.compile(r'\s[a-z]{2}') text1?=?'this?is?a?re?test' res?=?pattern.search(text1) print(res)?# if?res: ?print(res.group())?#is ?print(res.span())?#(4,?7) pattern2?=?re.compile(r'\s[a-z]{5}') text2?=?'是的,this?is?a?re?test' print(pattern2.search(text2))#None

match和search均用于匹配單個(gè)結(jié)果,唯一區(qū)別在于前者是從起始位置開(kāi)始匹配,而后者從任意位置匹配,匹配成功則返回一個(gè)match對(duì)象。

全搜索:findall/finditer

幾乎是最常用的正則表達(dá)式函數(shù),用于尋找所有匹配的結(jié)果,例如在爬蟲(chóng)信息提取中,可非常方便地提取所有匹配字段

import?re pattern?=?re.compile(r'\s[a-z]{2,5}') text1?=?'this?is?a?re?test' res?=?pattern.findall(text1) print(res)?#['?is',?'?re',?'?test']

findall返回的是一個(gè)列表對(duì)象類型,當(dāng)無(wú)匹配對(duì)象時(shí),返回一個(gè)空列表。為了避免因同時(shí)返回大量匹配結(jié)果占用過(guò)多內(nèi)存,可以調(diào)用finditer函數(shù)返回一個(gè)迭代器類型,其中每個(gè)迭代元素是一個(gè)match對(duì)象,可繼續(xù)調(diào)用group和span方法獲取相應(yīng)結(jié)果

import?re pattern?=?re.compile(r'\s[a-z]{2,5}') text1?=?'this?is?a?re?test' res?=?pattern.finditer(text1) for?r?in?res: ?print(r.group()) """ ?is ?re ?test """

當(dāng)匹配模式串較為簡(jiǎn)單或者僅需單詞調(diào)用時(shí),上述所有方法也可直接調(diào)用re類函數(shù),而無(wú)需事先編譯。此時(shí)各方法的第一個(gè)參數(shù)為模式串。

import?re pattern?=?re.compile(r'\d{2,5}') text?=?'this?is?re?test' re.findall('[a-z]+',?text)?#['this',?'is',?'re',?'test'] 03 字符串替換/分割

替換:sub/subn

當(dāng)需要對(duì)文本串進(jìn)行條件替換時(shí),可調(diào)用re.sub實(shí)現(xiàn) (當(dāng)然也可先編譯后再用調(diào)用實(shí)例方法) ,相應(yīng)參數(shù)分別為模式串、替換格式、文本串,還可以通過(guò)增加缺省參數(shù)限定替換次數(shù)和匹配模式。通過(guò)在模式串進(jìn)行分組,可實(shí)現(xiàn)字符串的格式化替換(類似字符串的format方法),以實(shí)現(xiàn)特定任務(wù)。

import?re text?=?'today?is?2020-03-05' print(re.sub('-',?'',?text))?#'today?is?20200305' print(re.sub('-',?'',?text,?1))?#'today?is?202003-05' print(re.sub('(\d{4})-(\d{2})-(\d{2})',?r'\2/\3/\1',?text))?#'today?is?03/05/2020'

re.sub的一個(gè)變形方法是re.subn,區(qū)別是返回一個(gè)2元素的元組,其中第一個(gè)元素為替換結(jié)果,第二個(gè)為替換次數(shù)

import?re text?=?'today?is?2020-03-05' print(re.subn('-',?'',?text))?#('today?is?20200305',?2)

分割:split

還可以調(diào)用正則表達(dá)式實(shí)現(xiàn)字符串的特定分割,相當(dāng)于.split()方法的一個(gè)加強(qiáng)版,實(shí)現(xiàn)特定模式的分割,返回一個(gè)切割后的結(jié)果列表

import?re text?=?'today?is?a?re?test,?what?do?you?mind?' print(re.split(',',?text))?#['today?is?a?re?test',?'?what?do?you?mind?'] 04 總結(jié)

python中的re模塊提供了正則表達(dá)式的常用方法,每種方法都包括類方法調(diào)用(如re.match)或模式串的實(shí)例調(diào)用(pattern.match)2種形式

常用的匹配函數(shù):match/fullmatch

常用的搜索函數(shù):search/findall/finditer

常用的替換函數(shù):sub/subn

常用的切割函數(shù):split

還有其他很多方法,但不是很常用,具體可參考官方文檔

另外,python還有第三方正則表達(dá)式庫(kù)regex可供選擇

到此這篇關(guān)于一文秒懂python正則表達(dá)式常用函數(shù)的文章就介紹到這了,希望大家以后多多支持!

分享標(biāo)題:包含python求函數(shù)表達(dá)式的詞條
鏈接URL:http://www.chinadenli.net/article14/dooeige.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作電子商務(wù)網(wǎng)站導(dǎo)航虛擬主機(jī)關(guān)鍵詞優(yōu)化網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司