簡體   English   中英

正則表達式必須匹配一行中的一個單詞(不替換)和一個模式(替換)

[英]Regex Must Match a Word (not to replace) AND a Pattern (to replace) in a Line

使用正則表達式(可以是 PCRE 或 SED,但也可以是 python [請指定]),我想刪除所有出現的包含單個字母逗號(/,.,/g)和單詞“Labels:”的行

因此,例如在這些行中:

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:)*(,.,) (也捕獲非“標簽:”)

使用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 添加)

它查找逗號,后跟字母,然后是單詞邊界,即逗號后面的 label 是單個字母。 然后,它通過類似的邏輯在逗號之前刪除任何剩余的單字母 label

您可能會使用:

(?i)(^(?!Labels:).*)|\b[a-z],|,[a-z]\b

查看在線演示


  • (?i) - 設置不區分大小寫的匹配 'on';
  • ( - 打開第一個捕獲組;
    • ^ - 開始字符串錨;
    • (?:labels:) - 斷言 position 后面沒有“標簽:”;
    • .* - 匹配(貪婪)除換行符以外的 0+ 個字符;
    • ) - 關閉第一個捕獲組;
  • | - 或者;
  • \b[az], - 匹配一個單詞邊界,后跟一個字母和一個逗號;
  • | - 或者;
  • ,[az]\b - 匹配逗號后跟單個字母和單詞邊界。

現在用你的第一個捕獲組替換它。

使用gnu-awk另一個變體。

對於以Labels:用空字符串替換逗號后跟單個字符 az 或 AZ 和單詞邊界。

awk '/^Labels:/{gsub(/,[a-zA-Z]\y|\y[a-zA-Z],/, "")};1' file

Output

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 正則表達式模塊正則表達式演示Python 演示

使用

perl -lpe 's/(?:,[^,](?=,|$))+//g  if  s/^Labels:\s*\K(?:[^,](?:,|$))*//' file

匹配“標簽:”(即\K ept)后,刪除任何前導單字符項。 如果發生這種情況,請刪除所有其他單字符項目。 這假定“標簽:”部分不能包含用逗號分隔的單個字符。

$ 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 依賴匹配空格或單詞邊界的解決方案可能無法正確處理此輸入。

這可能對您有用(GNU sed):

sed -E '/Labels/{s/( )\S,|(,)\S,|,\S$/\1\2/g;s//\1\2/g}' file

如果一行包含Labels ,則模式匹配 3 個備用匹配,並且如果第一個和第二個匹配替換為匹配的反向引用。 重復任何重疊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM