使用正則運算式(可以是 PCRE 或 SED,但也可以是 python[請指定]),我想洗掉所有出現的包含單字母逗號(/,.,/g)和“標簽:”一詞的行
因此,例如在這些行中:
Labels: K,ltemittel,System,j,Vakuum,s
Another tags: a,b,xxx,c,yyy,z
到
Labels: ltemittel,System,Vakuum
Another tags: a,b,xxx,c,yyy,z
我試過的:
- 非捕獲組(“標簽:”仍然被替換)
- 前瞻和后視(不能使用貪婪)
- 分組
/(Labels:)*(,.,)(也捕獲非“標簽:”)
uj5u.com熱心網友回復:
您可能會使用:
(?i)(^(?!Labels:).*)|\b[a-z],|,[a-z]\b
查看在線演示
(?i)- 設定不區分大小寫匹配'on';(- 打開第一個捕獲組;^- 開始字串錨;(?!labels:)- 斷言位置后面沒有“標簽:”;.*- 匹配(貪婪)0 換行符以外的字符;)- 關閉第一個捕獲組;
|- 或者;\b[a-z],- 匹配一個單詞邊界,后跟一個字母和一個逗號;|- 或者;,[a-z]\b- 匹配一個逗號后跟一個字母和一個單詞邊界。
現在用您的第一個捕獲組替換它。
uj5u.com熱心網友回復:
使用 sed
$ sed '/Labels:/s/,[A-Za-z]\>//g;s/\<[A-Za-z],//' input_file
Labels: ltemittel,System,Vakuum
Another tags: a,b,xxx,c,yyy,z
說明(由 Tripleee 添加)
它查找逗號,然后是字母,然后是單詞邊界,即逗號后面的標簽是單個字母。然后,它通過類似的邏輯在逗號之前洗掉任何剩余的單字母標簽
uj5u.com熱心網友回復:
使用 的另一種變體gnu-awk。
對于以Labels:逗號開頭的行,替換后跟單個字符 az 或 AZ 以及帶有空字串的單詞邊界。
awk '/^Labels:/{gsub(/,[a-zA-Z]\y|\y[a-zA-Z],/, "")};1' file
輸出
Labels: ltemittel,System,Vakuum
Another tags: a,b,xxx,c,yyy,z
由于您已經標記了 Python 和 pcre,另一種選擇是在字串的開頭使用\G錨和匹配Label:,并在組 1 中捕獲您想要保留的內容。
(?:^Labels:\h*|\G(?!^))\K(?:([^\s,]{2,}(?:,(?![a-z]$))?)|,?[a-z],?)
使用 Python PyPi regex 模塊查看regex 演示和Python 演示。
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E '/Labels/{s/( )\S,|(,)\S,|,\S$/\1\2/g;s//\1\2/g}' file
如果一行包含Labels3 個替代匹配的模式匹配,并且如果第一個和第二個匹配替換為匹配的反向參考。重復任何重疊。
uj5u.com熱心網友回復:
使用 perl:
perl -lpe 's/(?:,[^,](?=,|$)) //g if s/^Labels:\s*\K(?:[^,](?:,|$))*//' file
匹配“標簽:”(即\Kept)后,洗掉任何前導的單個字符項。如果發生這種情況,請洗掉所有其他單字符專案。這假設“標簽:”部分不能包含由逗號分隔的單個字符。
$ cat file
Labels: K,ltemittel,a System z,j,Vakuum,s
Another tags: a,b,xxx,c,yyy,z
$ perl -lpe 's/(?:,[^,](?=,|$)) //g if s/^Labels:\s*\K(?:[^,](?:,|$))*//' file
Labels: ltemittel,a System z,Vakuum
Another tags: a,b,xxx,c,yyy,z
注:在上面的測驗中System改為a System z。依賴匹配空格或單詞邊界的解決方案可能無法正確處理此輸入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/396630.html
上一篇:使用Regex回傳第一次出現
