❶ 正則表達式"或"怎麼寫
豎線「|」就是或的意思。意思是將兩個匹配條件進行邏輯「或」(or)運算。
例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字元不是所有的軟體都支持的。
而最簡單的元字元是點,它能夠匹配任何單個字元(注意不包括換行符)。
求值運算:
進行邏輯表達式求值運算,不但要注意邏輯運算符本身的運算規則,而且還必須要遵循下面的兩條原則:
1、對邏輯表達式從左到右進行求解。
2、短路原則:在邏輯表達式的求解過程中,任何時候只要邏輯表達式的值已經可以確定,則求解過程不再進行,求解結束。
具體理解邏輯表達式運算規則時可以先找到表達式中優先順序最低的邏輯運算符,以這些運算符為准將整個邏輯表達式分為幾個計算部分。
從最左邊一個計算部分開始,按照算術運算、關系運算和邏輯運算的規則計算該部分的值。每計算完一個部分就與該部分右邊緊靠著的邏輯運算符根據真值表進行邏輯值判斷。
如果已經能夠判斷出整個邏輯表達式的值則停止其後的所有計算;只有當整個邏輯表達式的值還不能確定的情況下才進行下一個計算部分的計算。
❷ replaceAll怎麼把字元串不區分大小寫
比如說在javaScript語言中,經常會碰到需要將一個字元串中的某個字元替換成另外一個字元的情況,而且有時候需要的是全局替換。而JavaScript中是沒有repaceAll()這個函數的。因此我們可以通過replace()函數和正則表達式結合來實現這個目的。
var str = 'aAbBccqq';
要把str中的a和A全部替換成p,
那麼可以這么寫:
str.replace(/aA/g, 'p');
運行的結果為pbBccqq。
❸ 用python腳本如何改變word中特定詞的字體顏色
最後一個參數,全部替換是2,但是selection每次只能是1個地方。所以要循環找
words=['python', 'hello', 'hi']
for i in set(words):
worddoc.Range(0,0).Select()
while w.Selection.Find.Execute(i, False, False, False, False, False, True, 0, True, "", 0):
w.Selection.Font.Color = 255
Execute 方法(Find 對象)
運行指定的查找操作。如果查找成功,則返回 True。(這說明其是同步執行)
語法
expression.Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace, MatchKashida, MatchDiacritics, MatchAlefHamza, MatchControl)
expression 必需。該表達式返回 Find 對象。
FindText Variant 類型,可選。指定需查找的文本。可用空字元串 ("") 查找格式。也可通過指定適當的字元代碼查找特殊字元。例如,「^p」對應段落標記,「^t」對應製表符。如果需要使用特殊字元列表,請參閱查找替換特殊字元和文檔元素示例。
如果 MatchWildcards 為 True,則可以指定通配符及其他高級搜索條件。例如,「*(ing)」 將查找以「ing」結尾的所有單詞。詳細內容,請參閱通配符搜索示例。
若要搜索符號字元,可鍵入 (^) 字元,零(0),然後鍵入符號字元的代碼。例如,「^0151」對應一條長劃線(—)。
MatchCase Variant 類型,可選。如果是 True,則查找文本需區分大小寫。相當於「編輯」菜單「查找和替換」對話框中的「區分大小寫」復選框。
MatchWholeWord Variant 類型,可選。如果為 True,則只查找匹配的完整單詞,而並非作為一個長單詞的一部分的文字。相當於「編輯」菜單「查找和替換」對話框中的「全字匹配」復選框。
MatchWildcards Variant 類型,可選。如果為 True,則查找的文字包含特殊搜索操作符。相當於「編輯」菜單「查找和替換」對話框中的「使用通配符」復選框。
MatchSoundsLike Variant 類型,可選。如果為 True,則查找與待查找文字發音相近的單詞。相當於「編輯」菜單「查找和替換」對話框中的「同音」復選框。
MatchAllWordForms Variant 類型,可選。如果為 True,則查找文字的所有形式(例如,「 sit」 將包含「sitting」和「sat」)。相當於「編輯」菜單「查找和替換」對話框中的「查找單詞的各種形式」復選框。
Forward Variant 類型,可選。如果為 True,則向下(向文檔尾部)搜索。
Wrap Variant 類型,可選。如果搜索從不是文檔開頭的位置開始,並到達文檔末尾(如 Forward 設置為 False,則相反),用本參數控制接下來的操作。當在選定內容或區域中沒有找到搜索文字時,本參數也控制接下來的操作。可以是下列 WdFindWrap 常量之一:
常量 描述
wdFindAsk 搜索完所選內容或者區域後,Microsoft Word 會顯示一條消息,詢問是否搜索文檔的其他部分。
wdFindContinue 到達搜索區域的開始或者結尾時,繼續執行查找操作。
wdFindStop 到達搜索范圍的開始或者結尾時,停止執行查找操作。
Format Variant 類型,可選。 如果為 True,則查找格式而非文字。
ReplaceWith Variant 類型,可選。替換文字。要刪除由 Find 參數指定的文字,可使用空字元串 ("")。與 Find 參數相似,本參數也可以指定特殊的字元和高級搜索條件。要將圖形對象或者其他非文本項指定為替換內容,可將這些項目置於「剪貼板」上,然後將 ReplaceWith 指定為「 ^c」。
Replace Variant 類型,可選。指定執行替換的個數:一個、全部或者不替換。可為下列 WdReplace 常量之一:wdReplaceAll、wdReplaceNone 或 wdReplaceOne。
MatchKashida Variant 類型,可選。如果為 True,則查找結果應與阿拉伯語文檔中區分 kashidas 的文本相匹配。由於選擇或安裝的語言支持不同(例如,美國英語),此參數可能不可用。
MatchDiacritics Variant 類型,可選。如果為 True,則查找結果應與區分音調符號的語言文本相匹配。由於選擇或安裝的語言支持不同(例如,美國英語),此參數可能不可用。
MatchAlefHamza Variant 類型,可選。如果為 True,則在阿拉伯語文檔中,查找內容應與區分 Alef Hamzas 的文本相匹配。由於選擇或安裝的語言支持不同(例如,美國英語),此參數可能不可用。
MatchControl Variant 類型,可選。如果為 True,則在從右到左運用語言的文檔中,查找內容應區分雙向控制字元。由於選擇或安裝的語言支持不同(例如,美國英語),此參數可能不可用。
❹ 如何用python replace字元串中間多餘的空格轉換為一個空格
定義一個函數
def replaceAll(old, new, str): while str.find(old) > -1: str = str.replace(old, new) return str
然後調用
context = "hello world nice ok done"print replaceAll(' ', ' ', context)
結果:
hello world nice ok done
要注意old和new不能相同,否則...請自己加個判斷
❺ python按行讀取文件,如何去掉換行符"\n
你按行讀取每行是str類型,如果是行首或者行末直接用.strip(),若干是行內也有,那就用.replaceall("\n","")
❻ 用python正則表達式替換字元串問題 我用python寫一個計算器,想用正則表達式將字元串中的一些內容替換,
先用正則表達式 sin((d+(.d+)?)) 取第一捕獲組的數據
把sin(45)中的角度值angle匹配出來,然後計算出sin(angle)的值value,
最後用正則表達式 "sin("+angle+")" 替換成String.valueOf(value) //value的字元串形式
我給你一個完整的Java語言的例子,你看看吧.
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
publicclassAA{
publicstaticvoidmain(String[]args){
Strings="1+2*3-(5/6)+sin(45)-ln(100)";
Stringregex="sin\((\d+(\.\d+)?)\)";
Patternp=Pattern.compile(regex);
Matcherm=p.matcher(s);
while(m.find()){
Stringangle=m.group(1);//取出sin函數的角度值
doubled=Double.parseDouble(angle);//把角度值轉換成double型
doublevalue=Math.sin(d/180*Math.PI);//把角度值轉換成弧度值然後計算sin函數值
s=s.replaceAll("sin\("+angle+"\)",String.valueOf(value));//把相應的sin(45)字元串替換成sin函數值
System.out.println(s);//輸出結果,你也可以在程序最後輸出結果,也就是在while循環完成後輸出結果
}
}
}
運行結果
1+2*3-(5/6)+0.7071067811865475-ln(100)
❼ JAVA中string.replace和string.replaceAll的區別及用法
java中string.replace和string.replaceAll都是對字元串內容進行替換的常用函數:
replace(CharSequence target, CharSequence replacement)
Returns a new string resulting from replacing all occurrences
of oldChar in this string with newChar.
replaceAll(String regex,
String replacement)Replaces each substring of this string that matches the given
regular expression with the given
replacement.
雖然在大多數的場景下,使用兩種函數得到的結果一樣,但是實際上還是有一定區別的:
replaceAll函數中被替換參數是regex,是正則表達式。如果傳入的是正則表達式中的特殊字元,則需要進行轉義,否則會報錯,而且在很多復雜的場景中,使用正則表達式也非常靈活;
而replace函數中被替換參數可以是char,也可以是CharSequence(即字元串序列):支持字元替換也支持字元串替換。
在大量且復雜的字元串替換場景下,建議使用replaceAll函數而不是replace函數,因為實際上replace函數裡面仍然是使用了replaceAll函數,所以replaceAll會比replace處理效率稍微快點。
如果被替換的字元串無法確定是否具有轉義字元時,而且也不需要轉義時,建議使用replace函數。
❽ 怎樣用正則表達式過濾掉頁面中除了<p></p>和<img>以外所有的標簽
這個還真不容易實現,單獨保留p或者img都可以,但是兩個條件放一起就不行了。於是我換了一種思路,用了個函數實現了,你看下,代碼是python下的:
importre
t='<html>asdfasdf<head>1111111111<body><p>asdfasdfasdf</p><imgherf="fff">'
defreplace_two(m):
"""
#過濾掉頁面中除了<p></p>和<img>以外所有的標簽
"""
all=re.findall(r'</?.*?>',m)
save=re.findall(r'</?(?:img).*?>|</?[pP]*?>',m)
foreinall:
ifenotinsave:
m1=m.replace(e,'')
m=m1
returnm
printreplace_two(t)
❾ python怎麼爬取某個人的微信朋友圈的信息
主要思路
從UI獲取文本信息是最為簡單的方法,於是應該優先逆向UI代碼部分。
逆向微信apk
首先解包微信apk,用dex2jar反編譯classes.dex,然後用JD-GUI查看jar源碼。當然,能看到的源碼都是經過高度混淆的。但是,繼承自安卓重要組件(如Activity、Service等)的類名無法被混淆,於是還是能從中看到點東西。
首先定位到微信APP package。我們知道這個是 com.tencent.mm。
在 com.tencent.mm
中,我們找到一個 ui
包,有點意思。
展開 com.tencent.mm.ui
,發現多個未被混淆的類,其中發現 MMBaseActivity直接繼承自 Activity
, MMFragmentActivity
繼承自 ActionBarActivity
, MMActivity
繼承自 MMFragmentActivity
,並且 MMActivity
是微信中大多數Activity的父類:
public class MMFragmentActivity
extends ActionBarActivity
implements SwipeBackLayout.a, b.a {
...
}
public abstract class MMActivity
extends MMFragmentActivity {
...
}
public class MMBaseActivity
extends Activity {
...
}
現在需要找出朋友圈的Activity,為此要用Xposed hook MMActivity。
創建一個Xposed模塊
參考 [TUTORIAL]Xposed mole devlopment,創建一個Xposed項目。
簡單Xposed模塊的基本思想是:hook某個APP中的某個方法,從而達到讀寫數據的目的。
小編嘗試hook com.tencent.mm.ui.MMActivity.setContentView這個方法,並列印出這個Activity下的全部TextView內容。那麼首先需要遍歷這個Activity下的所有TextView,遍歷ViewGroup的方法參考了SO的以下代碼:
private void getAllTextViews(final View v) {if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {View child = vg.getChildAt(i);
getAllTextViews(child);
}
} else if (v instanceof TextView ) {
dealWithTextView((TextView)v); //dealWithTextView(TextView tv)方法:列印TextView中的顯示文本}
}
Hook MMActivity.setContentView
的關鍵代碼如下:
findAndHookMethod("com.tencent.mm.ui.MMActivity", lpparam.classLoader, "setContentView", View.class, new XC_MethodHook() {...
});
在findAndHookMethod方法中,第一個參數為完整類名,第三個參數為需要hook的方法名,其後若干個參數分別對應該方法的各形參類型。在這里, Activity.setContentView(View view)方法只有一個類型為 View
的形參,因此傳入一個 View.class
。
現在,期望的結果是運行時可以從Log中讀取到每個Activity中的所有的TextView的顯示內容。
但是,因為View中的數據並不一定在 setContentView()時就載入完畢,因此小編的實驗結果是,log中啥都沒有。
意外的收獲
當切換到朋友圈頁面時,Xposed模塊報了一個異常,異常源從 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI這個類捕捉到。從類名上看,這個很有可能是朋友圈首頁的UI類。展開這個類,發現更多有趣的東西:
這個類下有個子類 a
(被混淆過的類名),該子類下有個名為 gyO的 ListView
類的實例。我們知道, ListView
是顯示列表類的UI組件,有可能就是用來展示朋友圈的列表。
順藤摸瓜
那麼,我們先要獲得一個 SnsTimeLineUI.a.gyO的實例。但是在這之前,要先獲得一個 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI.a的實例。繼續搜索,發現 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI有一個名為 gLZ
的 SnsTimeLineUI.a
實例,那麼我們先取得這個實例。
經過測試, com.tencent.mm.plugin.sns.ui.SnsTimeLineUI.a(boolean, boolean, String, boolean)這個方法在每次初始化微信界面的時候都會被調用。因此我們將hook這個方法,並從中取得 gLZ。
findAndHookMethod("com.tencent.mm.plugin.sns.ui.SnsTimeLineUI", lpparam.classLoader, "a", boolean.class, boolean.class, String.class, boolean.class, new XC_MethodHook() {@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("Hooked. ");
Object currentObject = param.thisObject;
for (Field field : currentObject.getClass().getDeclaredFields()) { //遍歷類成員field.setAccessible(true);
Object value = field.get(currentObject);
if (field.getName().equals("gLZ")) {
XposedBridge.log("Child A found.");
childA = value;
//這里獲得了gLZ
...
}
}
}
});
現在取得了 SnsTimeLineUI.a
的一個實例 gLZ
,需要取得這個類下的 ListView
類型的 gyO
屬性。
private void dealWithA() throws Throwable{if (childA == null) {
return;
}
for (Field field : childA.getClass().getDeclaredFields()) { //遍歷屬性field.setAccessible(true);
Object value = field.get(childA);
if (field.getName().equals("gyO")) { //取得了gyOViewGroup vg = (ListView)value;
for (int i = 0; i < vg.getChildCount(); i++) { //遍歷這個ListView的每一個子View...
View child = vg.getChildAt(i);
getAllTextViews(child); //這里調用上文的getAllTextViews()方法,每一個子View里的所有TextView的文本...
}
}
}
}
現在已經可以將朋友圈頁面中的全部文字信息列印出來了。我們需要根據TextView的子類名判斷這些文字是朋友圈內容、好友昵稱、點贊或評論等。
private void dealWithTextView(TextView v) {String className = v.getClass().getName();String text = ((TextView)v).getText().toString().trim().replaceAll("\n", " ");if (!v.isShown())
return;
if (text.equals(""))
return;
if (className.equals("com.tencent.mm.plugin.sns.ui.AsyncTextView")) {//好友昵稱
...
}
else if (className.equals("com.tencent.mm.plugin.sns.ui.SnsTextView")) {//朋友圈文字內容
...
}
else if (className.equals("com.tencent.mm.plugin.sns.ui.MaskTextView")) {if (!text.contains(":")) {
//點贊
...
} else {
//評論
...
}
}
}
自此,我們已經從微信APP里取得了朋友圈數據。當然,這部分抓取代碼需要定時執行。因為從 ListView中抓到的數據只有當前顯示在屏幕上的可見部分,為此需要每隔很短一段時間再次執行,讓用戶在下滑載入的過程中抓取更多數據。
剩下的就是數據分類處理和格式化輸出到文件,受本文篇幅所限不再贅述,詳細實現可參考作者GitHub上的源碼。