Insert a string after each number of words with conditions



  • @guy038

    Yes, in playing around with your original regex, I didn’t worry about the resulting space at the end of the line, as I have my “save” shortcut mapped to “trim trailing spaces” + “save”. The ONLY way files should be saved (for me!).



  • @guy038

    And it is great that you have Admin rights here and can edit old posts, but I’m neutral on this. I think that old posts should not be edited and clarifying posts should just be added on. It is difficult to follow sometimes when history is CHANGED rather than simply CORRECTED/CLARIFIED later. :-D



  • Hi, Alan,

    Yes, you’re right about it : I should have created a new post with the corrections, for a better history ! It’s just that my updated post was, still, quite long and I thought it would be more clear to, simply, change my initial post. But, I do understand your point of view !

    Cheers,

    guy038



  • @Scott-Sumner
    Thanks for the info!



  • Hello, @hu-ma and All

    To complete the @scott-sumner post, about the two syntaxes of the searched groups, in replacement :

    • \N, with 0 < N < 10

    • $N, with 0 <= N < 2,147,483,648

    There is the other practical syntax, below :

    • ${N}, with 0 <= N < 2,147,483,648

    Indeed, let’s imagine the original text:

    abcd
    1234
    WXYZ
    

    and the first S/R :

    SEARCH ^.(..).

    REPLACE $100|

    You obtain the simple text :

    |
    |
    |
    

    Why ?! Just because, in replacement, the regex engine is looking for the group $100, which, obviously, does not exist ! So, the regex engine rewrites a zero-length string, for the non-existent group 100, followed by the literal character | !

    Now, compare, with the second S/R, below :

    SEARCH ^.(..).

    REPLACE ${1}00|

    This time, you, correctly, get the text, below :

    bc00|
    2300|
    XY00|
    

    => All the changed lines begin by the second and third characters of the original lines of text ( $1 ), and are, simply, followed by the string 00|

    Best Regards,

    guy038



    • Sorry for pumping up old thread, but my issue is related to this one.

    Cutting to the thread…
    Look at Result#2 with desired arrangement

    -Example# 2
    Greetings My Liege! As your personal advisor [NEWLINE] , I am qualified to assist you in all[NEWLINE] matters related to ruling our civilization.[NEWLINE] I am at your service.
    
    --------
    +Seeked arrangement
    I am at your service. [NEWLINE] matters related to ruling our civilization.[NEWLINE], I am qualified to assist you in all[NEWLINE]Greetings My Liege! As your personal advisor
    

    I asked before for a way to rearrange the groups between [NEWLINE] to be backward… Now I’m asking for the same but in more automated way…

    Because not all lines have the same amount of Groups, I want to arrange all the lines that contains Groups between [NEWLINE] to be backward arrangement.

    -Example#3 Contains SIX groups
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six
    
    -------
    +Seeked arrangement
     six[NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE]One
    

    While using the same regex or python script

    -Example#4 Contains 4 groups 
    I want [NEWLINE] this [NEWLINE] to be  [NEWLINE] last
    
    ------
    +Seeked arrangement
     last[NEWLINE] to be [NEWLINE] this [NEWLINE]I want 
    


  • Hi, @abuali-huma,

    I found a general method, which uses three consecutive S/R. We’ll need two dummy characters, NOT used in the current file. I, personally, chose the # and @ characters, but any other may be used !

    • The first S/R :

      • Changes any string [NEWLINE], possibly preceded and/or followed with a space character, by the dummy character #

      • Adds, also, a # character at the end of any non-blank line

    • The second S/R is the main S/R, which rewrites the different parts, between the # character, in reverse order.

      • Note that this S/R will have to be performed as many times, till the message Replace All: 0 occurrences were replaced occurs, in the Replace dialog

      • The general idea, about this S/R, is to switch the beginning and ending parts of the found text, adding a @ character, at the end of the exchanged parts, in order that the next run of this S/R, will avoid these moved parts of text ! Hence, the decreasing number of occurrences found, till zero :-))

    • The Third S/R :

      • Changes the # character, possibly preceded by a @ character, inside text, by the string [NEXLINE], preceded and followed with a space character

      • Deletes the # character, possibly preceded by a @ character, when located at the end of the lines

    All these S/R will use the Regular expression search mode, the Wrap around option and the Replace All button, of the Replace dialog

    So, let’s start with the original text, below :

    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six [NEWLINE] seven [NEWLINE] eight [NEWLINE] nine [NEWLINE] ten [NEWLINE] eleven [NEWLINE] twelve
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six [NEWLINE] seven [NEWLINE] eight [NEWLINE] nine [NEWLINE] ten [NEWLINE] eleven
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six [NEWLINE] seven [NEWLINE] eight [NEWLINE] nine [NEWLINE] ten
    Other text NOT concerned
    by this Search Replacement
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six [NEWLINE] seven [NEWLINE] eight [NEWLINE] nine
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six [NEWLINE] seven [NEWLINE] eight
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six [NEWLINE] seven
    Bla bla blah
    Bla bla blah
    Bla bla blah
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five [NEWLINE] six
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four [NEWLINE] five
    One [NEWLINE] two [NEWLINE] three [NEWLINE] four
    Dummy text
    inserted, in between !
    One [NEWLINE] two [NEWLINE] three
    One [NEWLINE] two
    One
    I want [NEWLINE] this [NEWLINE] to be  [NEWLINE] last
    

    After running the following S/R , once :

    SEARCH (?-s)\x20?[NEWLINE]\x20?|(?<=.)$

    REPLACE #

    You should get the text, below :

    One#two#three#four#five#six#seven#eight#nine#ten#eleven#twelve#
    One#two#three#four#five#six#seven#eight#nine#ten#eleven#
    One#two#three#four#five#six#seven#eight#nine#ten#
    Other text NOT concerned#
    by this Search Replacement#
    One#two#three#four#five#six#seven#eight#nine#
    One#two#three#four#five#six#seven#eight#
    One#two#three#four#five#six#seven#
    Bla bla blah#
    Bla bla blah#
    Bla bla blah#
    One#two#three#four#five#six#
    One#two#three#four#five#
    One#two#three#four#
    Dummy text#
    inserted, in between !#
    One#two#three#
    One#two#
    One#
    I want#this#to be #last#
    

    After running the following S/R, SEVEN times, one after another :

    SEARCH (?-s)([^@#\r\n]+?)#(.+#)?([^@#\r\n]+)#

    REPLACE \3@#\2\1@#

    The modified text is, now :

    twelve@#eleven@#ten@#nine@#eight@#seven@#six@#five@#four@#three@#two@#One@#
    eleven@#ten@#nine@#eight@#seven@#six#five@#four@#three@#two@#One@#
    ten@#nine@#eight@#seven@#six@#five@#four@#three@#two@#One@#
    Other text NOT concerned#
    by this Search Replacement#
    nine@#eight@#seven@#six@#five#four@#three@#two@#One@#
    eight@#seven@#six@#five@#four@#three@#two@#One@#
    seven@#six@#five@#four#three@#two@#One@#
    Bla bla blah#
    Bla bla blah#
    Bla bla blah#
    six@#five@#four@#three@#two@#One@#
    five@#four@#three#two@#One@#
    four@#three@#two@#One@#
    Dummy text#
    inserted, in between !#
    three@#two#One@#
    two@#One@#
    One#
    last@#to be @#this@#I want@#
    

    Seven consecutive runs of that regex S/R are required, to get the sought text :

    • Run 1 : 12 occurrences replaced
    • Run 2 : 10 occurrences replaced
    • Run 3 : 7 occurrences replaced
    • Run 4 : 5 occurrences replaced
    • Run 5 : 3 occurrences replaced
    • Run 6 : 1 occurrences replaced
    • Run 7 : 0 occurrences replaced

    Note : After each run, you may hit the Find Next button, before hitting the Replace All button, to guess the general process !

    The part [^@#\r\n], in the searched regex, represents any single character, different from @, #, \n and \r


    Then, after running the last S/R, once :

    SEARCH (?-s)(@?#)(?=.)|@?#

    REPLACE ?1\x20[NEWLINE]\x20

    We obtain our final text :

    twelve [NEWLINE] eleven [NEWLINE] ten [NEWLINE] nine [NEWLINE] eight [NEWLINE] seven [NEWLINE] six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    eleven [NEWLINE] ten [NEWLINE] nine [NEWLINE] eight [NEWLINE] seven [NEWLINE] six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    ten [NEWLINE] nine [NEWLINE] eight [NEWLINE] seven [NEWLINE] six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    Other text NOT concerned
    by this Search Replacement
    nine [NEWLINE] eight [NEWLINE] seven [NEWLINE] six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    eight [NEWLINE] seven [NEWLINE] six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    seven [NEWLINE] six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    Bla bla blah
    Bla bla blah
    Bla bla blah
    six [NEWLINE] five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    five [NEWLINE] four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    four [NEWLINE] three [NEWLINE] two [NEWLINE] One
    Dummy text
    inserted, in between !
    three [NEWLINE] two [NEWLINE] One
    two [NEWLINE] One
    One
    last [NEWLINE] to be  [NEWLINE] this [NEWLINE] I want
    

    The search part looks for the regex @?#, either, inside the lines ( case group 1 defined ) or at end of lines ( case NO group 1 )

    The replacement part means that, IF group 1 exists, the searched text is replaced by the string [NEWLINE], surrounded by space characters, ELSE NO replacement occurs

    Et voilà !

    Best Regards,

    guy038



  • Thanks very much!
    But just to be clear, in the first regex

    SEARCH (?-s)\x20?[NEWLINE]\x20?|(?<=.)$

    REPLACE #

    Removing the value ** \x20** will result this
    SEARCH (?-s)?[NEWLINE]?|(?<=.)$

    Which will result capturing the space “if available” before and after [NEWLINE] string in first and last group?



  • I found out the removing the \x20 does what I described… Thanks again



  • I modified the original Search regex, as it catches some Unicode characters with will break the line in a middle of a word. So in the modified regex I replace \W with \x20 (space character)… so far no word breaking issues
    Here is the modified one
    (?-s).{1,44}(?=\x20)


Log in to reply